两个例子
例子一:
父类:
public class Father { int age; public Father() { age = 50; } }
子类:
public class Son extends Father { public Son() { age = 25; } }
多态的创建子类,看看年龄到底是多少:
public class FieldHasNoPolymorphic { public static void main(String[] args) { Father guy = new Son(); System.out.println("This guy's age is " + guy.age); } }
例子一的输出:
This guy's age is 25
很合理对吧?毕竟以前学Java SE的时候,不管是视频还是书里,都是说编译看左边,运行看右边,即父类变量的引用( guy
)指向了子类对象( Son
),那么代码访问子类的年龄,自然是输出 25
例子二:
父类:同例子一
子类:
public class Son extends Father { // 跟例子一相比多声明了一个父类同名字段 int age; ... }
同样是多态的创建子类,看看年龄是多少:
public class FieldHasNoPolymorphic { public static void main(String[] args) { Father guy = new Son(); System.out.println("This guy's age is " + guy.age); } }
例子二的输出:
This guy's age is 50
奇怪,明明在子类构造方法中给子类 age
初始化为了 25
,怎么输出是 50
?
字段不参与多态性
字段永远不会参与多态,当子类声明父类的同名字段时,虽然在子类的内存中两个字段都会存在,但是子类的字段会遮蔽父类的同名字段
什么意思呢?假设将在父类继承而来的 age
字段叫做 ageF
,而子类中声明的 age
字段叫做 ageS
,虽然内存中这两个字段都会存在,但是子类的字段遮蔽了父类的同名字段,所以子类的构造方法中实际上是对 ageS
进行了初始化,但是通过多态创建的子类对象时,guy.age
访问的却是 ageF
,这就是为什么例子二的年龄输出是 50
而不是 25
。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。