繼承和方法重寫已經很熟悉了,這次
主要驗證一下,當一個父類的引用指向一個對象的時候,它會調用子類的方法,而不是父類的。
引用在棧記憶體中存在對象的記憶體位址。真正的對象(通過 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 ^-^