1. 程式人生 > >Java基礎 | 編譯時型別和執行時型別

Java基礎 | 編譯時型別和執行時型別

一、前言

最近在做筆試題的時候,才看到有這麼一個知識點,查了好幾篇部落格,在這裡記錄一下


二、是什麼

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 類;之後以此類推


三、參考