Java OOP继承执行
为什么TestClass.main()的执行会输出202 101Java 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
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。我会尽快记下你的答案