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