子类调用父类方法探讨

假设A是父类,B是继承A的子类,那么B如果要调用A的a方法,应该这样:
B b=new B();

b.a();

一直都说this指的是当前对象,super指的是父类对象。但是对这个this理解还是不透彻,今天看effective java 第14条,有个例子一直不理解:

[java]  view plain  copy
  1. package com.zgd;  
  2.   
  3. public class SuperTest {  
  4.     public static void main(String[] args) {  
  5.         Child c = new Child ();  
  6.         c.addAll();  
  7.     }  
  8. }  
  9.   
  10. class Parent{  
  11.     public void add(){  
  12.         System.out.println("A add...");  
  13.     }  
  14.       
  15.     public void addAll(){  
  16.         System.out.println("A add ALL...");  
  17.         add();  
  18.         //在父子类之间,如果在父类中使用this关键字,那么运行子类时如果走到this行,指的是子类而不是父类。  
  19.         //谁调用,this就是指谁  
  20.         System.out.println(this.getClass());  
  21.     }  
  22. }  
  23.   
  24. class Child extends Parent{  
  25.   
  26.     @Override  
  27.     public void add() {  
  28.         // TODO Auto-generated method stub  
  29.         System.out.println("B add...");  
  30.         super.add();  
  31.     }  
  32.   
  33.     @Override  
  34.     public void addAll() {  
  35.         // TODO Auto-generated method stub  
  36.         System.out.println("B add ALL...");  
  37.         super.addAll();  
  38.     }  
  39.       
  40. }  

最后输出的结果是
B add ALL...
A add ALL...
B add...
A add...
按我的理解,super.addAll()方法调用来Parent中的addAll(),而Parent中的addAll()调用了add()。这里的add最后调用的是Child的add(),既然是super.addAll(),为何最后竟然调用的是子类的add()方法。。。

这里涉及到的问题是当子类调用super走到父类的方法中,这时的对象this到底是指Child子类还是父类Parent? 

正确答案是子类,this.add();其中的this是指当前对象,也就是Child c = new Child();中的c.

因此虽然是在父类中执行的add方法,但实际上执行的是子类的add方法

在父类的add 方法中

[java]  view plain  copy
  1. System.out.println(this.getClass());  
  2. 结果是Child而不是Parent!  

猜你喜欢

转载自blog.csdn.net/boguesfei/article/details/80497628