1 public class ParentChildTest { 2 public static void main(String[] args) { 3 Parent parent=new Parent(); 4 parent.printValue(); 5 Child child=new Child(); 6 child.printValue(); 7 parent=child; 8 parent.printValue(): 9 parent.myValue++; 10 parent.printValue(); 11 ((Child)parent).myValue++; 12 parent.printValue(); 13 }
1、
- 首先,Parent类和Child类都有一个名为
myValue
的实例变量,但是Child类中覆盖了父类的printValue
方法。 - 在第3行,创建了一个Parent类的对象
parent
,然后调用其printValue
方法。这将打印出Parent类的myValue
,即0。 - 在第5行,创建了一个Child类的对象
child
,然后调用其printValue
方法。这将打印出Child类的myValue
,即1。 - 在第7行,将
parent
引用指向child
对象,这是多态性的一种体现。 - 在第8行,调用
parent
的printValue
方法,这将再次打印Child类的myValue
,仍然为1。 - 在第9行,递增
parent
的myValue
,此时parent
引用指向Child对象,因此myValue
增加到2。 - 在第10行,再次调用
parent
的printValue
方法,这将打印Child类的myValue
,即2。 - 在第11行,将
parent
强制转型为Child对象,并递增其myValue
。此时,parent
引用指向Child对象,因此Child类的myValue
增加到3。 - 在第12行,再次调用
parent
的printValue
方法,这将打印Child类的myValue
,即3。
2、
Java语法特性:
-
多态性:在第7行,可以将子类对象赋给父类引用,并通过父类引用来访问子类的方法和属性。
-
方法覆盖(方法重写):Child类覆盖了Parent类的
printValue
方法,因此在运行时调用parent.printValue()
时,实际上调用的是Child类的printValue
方法。 -
强制类型转换:在第11行,我们使用了强制类型转换将
parent
引用转为Child类,以访问Child类特有的属性和方法。 -
实例变量继承:Child类继承了Parent类的实例变量
myValue
,但子类可以覆盖父类的实例变量,即使两者具有相同的名称。