天天看點

java 中父類引用指向子類對象時

繼承和方法重寫已經很熟悉了,這次

主要驗證一下,當一個父類的引用指向一個對象的時候,它會調用子類的方法,而不是父類的。

引用在棧記憶體中存在對象的記憶體位址。真正的對象(通過 new Student()建立的)存放在堆記憶體裡。

在這塊堆記憶體區域内,存在的是子類的屬性(包括自己特有的,以及通過super()構造方法中從父類獲得的)

和方法(繼承父類但沒有覆寫的,以及覆寫父類的方法和自己特有的),盡管引用是聲明為父類的引用,

但是它指向的子類的對象,在執行方法的時候,是通過引用指向的堆記憶體區域内執行的。也就是到底執行父類

方法還是子類方法是由對象決定的,跟引用沒有直接關系。

示範代碼如下:

Person.java

public class Person{
    
    private String name;

    public Person(){}

    public void setName(String name){
        this.name = name;    
    }
    public String getName(){
        return this.name;    
    }
    
    public void introduce(){
        System.out.println("Hello, I'm a Person object, and my name is "
            +getName());    
    }
}
           

Student.java

public class Student extends Person{
    
    public Student(){
        super();    
    }
    
    public void introduce(){
        System.out.println("I'm a Student object and my name is "
            +getName());    
    }
}
           

Test.java

public class Test{

    public static void main(String[] args){
        Person p = new Student();
        p.setName("^-^");
        p.introduce();
    }
}
           

輸出結果為:

I'm a Student object and my name is ^-^