假设A是父类,B是继承A的子类,那么B如果要调用A的a方法,应该这样:
B b=new B();
b.a();
一直都说this指的是当前对象,super指的是父类对象。但是对这个this理解还是不透彻,今天看effective java 第14条,有个例子一直不理解:
- package com.zgd;
- public class SuperTest {
- public static void main(String[] args) {
- Child c = new Child ();
- c.addAll();
- }
- }
- class Parent{
- public void add(){
- System.out.println("A add...");
- }
- public void addAll(){
- System.out.println("A add ALL...");
- add();
- //在父子类之间,如果在父类中使用this关键字,那么运行子类时如果走到this行,指的是子类而不是父类。
- //谁调用,this就是指谁
- System.out.println(this.getClass());
- }
- }
- class Child extends Parent{
- @Override
- public void add() {
- // TODO Auto-generated method stub
- System.out.println("B add...");
- super.add();
- }
- @Override
- public void addAll() {
- // TODO Auto-generated method stub
- System.out.println("B add ALL...");
- super.addAll();
- }
- }
最后输出的结果是
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 方法中
- System.out.println(this.getClass());
- 结果是Child而不是Parent!