Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OOP继承执行_Java_Oop_Class - Fatal编程技术网

Java OOP继承执行

Java OOP继承执行,java,oop,class,Java,Oop,Class,为什么TestClass.main()的执行会输出202 101 class BaseClass { int data = 101; public void print() { System.out.print(data + " "); } public void fun() { print(); } } class SubClass extends BaseClass { int data = 20

为什么TestClass.main()的执行会输出202 101

class BaseClass
{
    int data = 101;
    public void print()
    {
        System.out.print(data + " ");
    }
    public void fun()
    {
        print();
    }
}
class SubClass extends BaseClass
{
    int data = 202;
    public void print()
    {
        System.out.print(data + " ");
    }
}
class TestClass
{
    public static void main(String[] args)
    {
        BaseClass obj = new SubClass();
        obj.print();
        obj.fun();
        System.out.print(obj.data);
    }
}
我的OOP知识很差,我认为执行方式必须是这样:

1-对象打印();从子类打印202

2-因为没有obj.fun();方法调用父方法,因此输出应该是101

3-系统输出打印(对象数据);应打印202,因为该值在子类中被重写


所以我认为输出应该是202 101 202,但它不是,你能解释为什么吗?

因为方法是多态的,而字段不是多态的

如果你移除

int data = 101;
基类中,它将不会编译

既然没有obj.fun();方法调用父方法,因此输出应该是101

实际上,它为
fun
调用超类,但超类调用
print
,当
print
被重写时,就会调用重写版本(在子类中)

系统输出打印(对象数据);应打印202,因为该值在子类中被覆盖


变量不被重写,而是被子类隐藏,因为
obj
声明为
BaseClass
,它直接访问它的
数据
属性。与方法调用不同,这是在编译时决定的。

1和2-方法是多态的,
基类中的方法将使用
子类中的方法,如果它能够并且ofc如果您引用了
子类


3-字段不是多态的。它取自引用类型。

关键在于决定执行哪个方法。根据对象实例的类型进行选择。在您的例子中,obj是一个
子类
,每次调用
print()
都将执行
子类
的print方法。这种机制被称为

我建议您不要混合使用方法和变量,而是从只对方法进行一些测试开始。代码基本相同,具有相同的多态性行为,但没有变量

class BaseClass
{
    public void print()
    {
        System.out.print(101 + " ");
    }
    public void fun()
    {
        print();
    }
}
class SubClass extends BaseClass
{
    public void print()
    {
        System.out.print(202 + " ");
    }
}
class TestClass
{
    public static void main(String[] args)
    {
        BaseClass obj = new SubClass();
        obj.print();
        obj.fun();
    }
}

现在我明白了,谢谢Binyamin。我会尽快记下你的答案