class Father{
String name = "Father";
String getname(){
return name;
}
String greeting(){
return "class Father";
}
}
class Son extends Father{
String name= "Son";
String greeting(){
return "class Son";
}
}
public class Polymorphism{
public static void main(String[] args){
Father fa = new Son();
System.out.print(fa.greeting()+", ");
System.out.print(fa.name+", ");
System.out.println(fa.getname());
}
}
请问以上的程式执行结果
第一个print为class Son
没问题。因为覆写
第三个print为Father
没问题。因为父类别中才有这个方法
第二个我不懂
为什么结果是Father 而不是Son呢?
最后实际执行的实体
不是new Son( ); 吗?
怎么理解,感谢
作者:
bitlife (BIT一生)
2016-04-14 22:14:00多型和确定型本身就是相反的概念,多型是在执行时期为了确定要使用那个method,所以需要确定执行时期的型别,而field的存取,在编译时期就决定了要存取哪个型别的某个field要存取name,所以fa在编译时期就确定了它是Father型别那个fa = new Son(); 是人类望文生义理解它实际会是Son,但compile time没有这个资讯(别期待编译器像人一样“懂”),如果你是写 Father fa = someFunction() 呢,不把整个程式实际跑一遍是不可能在compile time知道的.总之,多型是到run time再查真实型别以执行对应该执行的method实务则用virtual function/method table来做,把问题提早到编译时期即可解决,但field不能这样干,因为field如前面所说,不是pure virtual,只是被子代遮掉,实际上有两份,pure virtual function在virtual function/method table中,子代的method会盖掉亲代的method更正,上面的pure都去掉,和pure与否无关(C++的virutal在Java是默认,而C++的pure virtaul变成了Java的virutal,我写的时候一直想着C++的实务,才多写pureabstract XD