歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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

繼承和方法重寫已經很熟悉了,這次主要驗證一下,當一個父類的引用指向一個對象的時候,它會調用子類的方法,而不是父類的。

引用在棧內存中存在對象的內存地址。真正的對象(通過 new Student()創建的)存放在堆內存裡。

在這塊堆內存區域內,存在的是子類的屬性(包括自己特有的,以及通過super()構造方法中從父類獲得的)和方法(繼承父類但沒有覆蓋的,以及覆蓋父類的方法和自己特有的),盡管引用是聲明為父類的引用,但是它指向的子類的對象,在執行方法的時候,是通過引用指向的堆內存區域內執行的。也就是到底執行父類方法還是子類方法是由對象決定的,跟引用沒有直接關系。


演示代碼如下:


Person.java

  1. public class Person{  
  2.       
  3.     private String name;  
  4.   
  5.     public Person(){}  
  6.   
  7.     public void setName(String name){  
  8.         this.name = name;      
  9.     }  
  10.     public String getName(){  
  11.         return this.name;      
  12.     }  
  13.       
  14.     public void introduce(){  
  15.         System.out.println("Hello, I'm a Person object, and my name is "  
  16.             +getName());      
  17.     }  
  18. }  
Student.java
  1. public class Student extends Person{  
  2.       
  3.     public Student(){  
  4.         super();      
  5.     }  
  6.       
  7.     public void introduce(){  
  8.         System.out.println("I'm a Student object and my name is "  
  9.             +getName());      
  10.     }  
  11. }  
Test.java
  1. public class Test{  
  2.   
  3.     public static void main(String[] args){  
  4.         Person p = new Student();  
  5.         p.setName("^-^");  
  6.         p.introduce();  
  7.     }  
  8. }  
輸出結果為:

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

Copyright © Linux教程網 All Rights Reserved