1. parent父類與child子類
public class parent { public void add(){ System.out.println("A add..."); } public void addAll(){ System.out.println("A add ALL..."); this.add();-----------------------------------------這里調用的是子類 this.hello();---------------------------------------這里調用的是父類 System.out.println(this.getClass()); } public void hello(){ System.out.println("hello"); } }
public 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(); } }
2. main方法
public class main { public static void main(String[] args) { child c = new child();---------------------------這里實例化的是子類 c.addAll(); } }
先說一下流程:首先實例化的是子類,自始自終都沒有實例化父類對象,this的簡單理解就是當前對象的引用。然后它調用了子類的addAll()------>通過super關鍵字調用父類的addAll(),然后重點來了,父類中的this .add()這里打印出來的this不應該是父類對象,因為子類中重寫了父類的方法,盡管父類的方法並沒有失效,但是this會優先因為重寫去子類中尋找add()方法(如果一開始實例化的是父類對象,那么this.add就會自然的調用自身父類的add,這很好理解),第二句this.hello(),因為子類中不存在hello()重寫,也就會到父類自身中去尋找hello()方法。---------總之this關鍵字會優先根據實例化的對象去尋找該對象的方法,父類使用this調用取決於子類中是否有同樣的重寫方法(覆蓋了)。如果沒有就會調用自身的方法。!!!!!