[问题] 多型的概念

楼主: birdy1147 (Allen)   2016-04-14 13:08:26
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( ); 吗?
怎么理解,感谢
作者: snowlike (.zZ)   2016-04-14 14:06:00
先不论怎么理解,第二个和第三个如果不同实际上更奇怪name 实际上有两个只是 son 里的 name 产生了遮蔽的效果
作者: bitlife (BIT一生)   2016-04-14 14:14:00
docs.oracle.com/javase/specs/jls/se7/html/jls-4.htmlThe Java programming language is a statically typedlanguage, which means that every variable and everyexpression has a type that is known at compile time.
作者: snowlike (.zZ)   2016-04-14 14:51:00
因为你看的是 Fa 的 name,会提遮蔽就是因为非继承关系楼上是 Fa 和 So 的变量都存在的意思不用再往继承思考
作者: bitlife (BIT一生)   2016-04-14 15:58:00
不是告诉你在compile time就确定型别了吗?^variable
作者: ntuarthur (ntuarthur)   2016-04-14 16:07:00
virtual method table
作者: 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
作者: ntuarthur (ntuarthur)   2016-04-15 15:41:00
楼上干脆回一篇比较好读。或者就给他key word XD

Links booklink

Contact Us: admin [ a t ] ucptt.com