編譯的類型和運行時的類型

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()方法就是運行時的變量。




發佈了110 篇原創文章 · 獲贊 46 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章