public class TestDemo1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Person p=new Women();
System.out.println("p.name:"+p.name);
p.show();
System.out.println("p.name:"+p.name);
}
}
class Person{
public String name;
public Person()
{
name="person";
}
public void show()
{
System.out.println("class person's show()");
}
}
class Women extends Person
{
public String name;
public Women()
{
name="women";
}
public void show2()
{
System.out.println("class women's show()");
}
}
輸出結果;
p.name:person
class women's show()
p.name:person
Person p=new Women()(Women類繼承自Person類)那麼,假如p的屬性修飾符爲public 訪問屬性時得到的是Person類的屬性還是Women類的屬性,方法調用又是哪個類?答案:會得到Person類的屬性,調用Women類的方法。爲什麼會這樣呢?這裏就需要知道什麼是編譯時類型和運行時類型,Java程序狀態會分爲編譯和運行這兩種狀態,編譯時,JVM會在棧中靜態創建基本數據變量,和引用數據變量的引用,回到剛剛那句代碼,顯然,p這個引用就是在編譯時創建的,那麼,p的編譯時類型就是Person了,當運行這句java代碼時,JVM在堆中爲p新建一塊內存,對應new Women()這句代碼,所以p的運行時類型就是Women
public class Father {
public String name;
public Father(){
this.name = "father";
}
public void show(){
System.out.println("father's name : " + this.name);
}
}
public class Son extends Father {
public String name;
public Son(){
this.name = "son";
}
public void show(){
System.out.println("Son's name: " + this.name);
}
public void show2(){
System.out.println("show2");
}
public static void main(String[] args) {
Father son = new Son();
son.show2();//此處就會報錯
}
}
原因:
編寫Java程序時,引用類型只能調用其編譯時類型的變量,不能調用其運行時的類型變量。此時的show2()方法就是運行時的變量。