Java基礎 | 編譯時型別和執行時型別
阿新 • • 發佈:2019-02-06
一、前言
最近在做筆試題的時候,才看到有這麼一個知識點,查了好幾篇部落格,在這裡記錄一下
二、是什麼
Java引用變數有兩個型別,一個是編譯時型別,還有一個是執行時型別。
編譯時型別是由宣告該變數時使用的型別所決定,執行時型別是由該變數指向的物件型別決定
如果兩種型別不一致,就會出現多型,因此就會將子類物件之間賦值給父類引用變數,稱為向上轉型,而不用進行型別轉換。如 Animal a = new Bird()
,其中引用變數 a 的編譯時型別是 Animal,執行時型別是 Bird,兩者不一致,因此出現多型
當使用該物件引用進行呼叫的時候,有這麼一條規則,物件呼叫編譯時型別的屬性和執行時型別的方法
我們直接看一個例子來驗證這句話
class Person {
public String name;
public Person() {
name = "person";
}
public void show() {
System.out.println("person show");
}
}
class Woman extends Person {
public String name;
public Woman() {
name = "woman";
}
public void show() {
System.out.println("woman show");
}
}
public class TestDemo {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person.name);
person.show();
System.out.println();
Person person1 = new Woman ();
System.out.println(person1.name);
person1.show();
System.out.println();
Woman woman = new Woman();
System.out.println(woman.name);
woman.show();
}
}
結果:
person
person show
person
woman show
woman
woman show
從結果可以看出,第一條語句 person 引用呼叫的屬性屬於 Person 類,person 引用呼叫的方法還是 Person 類;之後以此類推