Welcome 微信登录

首页 / 操作系统 / 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 ^-^