3

为什么执行 TestClass.main() 输出 202 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- obj.print(); 从子类打印 202

2- 因为没有 obj.fun(); 子类中的方法它调用父方法,所以输出应该是 101

3- System.out.print(obj.data); 应该打印 202,因为该值在子类中被覆盖。

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

4

4 回答 4

4

由于没有 obj.fun(); 子类中的方法它调用父方法,所以输出应该是 101

实际上,它为 调用超类fun,但超类调用print,并且由于print被覆盖,覆盖版本(在子类中)被调用。

System.out.print(obj.data); 应该打印 202,因为该值在子类中被覆盖。

变量不会被覆盖,而是被子类隐藏,如obj声明为BaseClass,它直接访问它的data属性。与方法调用不同,这是在编译时决定的。

于 2012-05-14T04:42:00.837 回答
2

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

如果你删除

int data = 101;

从你BaseClass那里它不会编译

于 2012-05-14T04:40:40.223 回答
1

诀窍在于决定执行哪种方法。该选择是根据对象实例的类型做出的。在您的情况下, obj 是 aSubClass并且每次调用print()都会执行SubClass. 这种机制在 OOP 中称为多态性

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

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();
    }
}
于 2012-05-14T04:45:58.527 回答
0

1 和 2 - 方法是多态的 - 方法 frombase class将使用方法 from sub class如果可以的话,如果你有参考sub class

3 - 字段不是多态的。它取自参考类型。

于 2012-05-14T04:43:59.217 回答