按:我感觉我出了一个还不错的面试题~
代码如下:
SuperClass.java
public class SuperClass {
int a = 3;
public int getA() {
return a;
}
}
SubClass.java
public class SubClass extends SuperClass{
int a = 4;
@Override
public int getA() {
return a;
}
}
Client.java
public class Client {
public static void main(String[] args) {
SuperClass s = new SubClass(); //!!! s 的编译时类型是 SuperClass, 运行时类型是 SubClass
System.out.println(s.a); // 3
System.out.println(s.getA()); // 4
System.out.println(s.a != s.getA()); // true
}
}
Client
的几个输出语句的输出结果写在代码注释中了。其中,需要特别注意的是:
s.a != s.getA()
是 true
! 这个初看有点让人不解,s.a
怎么会不等于自身?(I’m not me?) 出现这个情况,正是 多态(Polymorphism) 的限定所决定的:
s.getA()
访问的是子类 SubClass
的方法 getA()
.s.a
的值是父类 SupperClass
的 a
, 为3.SubClass.getA()
中访问的是 SubClass
的实例的变量 a
, 所以为4.PS: 刚刚写了个多态的例子,想了下,觉得比较麻烦,罗嗦,就改了一个简化版如上。
这篇文章最初于2018.11.25 15:56发布在OSC上