2015-06-20 80 views
2

的超級方法,讓我們說,我有類A和延伸AB, 這裏是類:返回`this`在繼承

答:

public class A { 
    public int x; 
    public static int y; 
    public A(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 
    public int getX() { return x; } 
    public static int getY() { return y; } 
    public A get1() { return this; } 
    public A get2() { return new B(x, y); } 
} 

B:

public class B extends A { 
    public int x; 
    public B(int x, int y) { 
     super(x, y); 
     this.x = x*2; 
     this.y = y*2; 
    } 
    public int getX() { return x; } 
     public static int getY() { return y*3; } 
    public A get1() { 
     x++; 
     return super.get1(); 
    } 
    public A get2() { return get1(); } 
} 

以下是主要功能:

public static void main(String[] args) { 
    A a1 = new A(5, 10); 
    A a2 = a1.get2(); 
    A a3 = a2.get2(); 

    System.out.println("a1.x=" + a1.x); 
    System.out.println("a1.y=" + a1.y); 
    System.out.println("a2.x=" + a2.x); 
    System.out.println("a2.getX()=" + a2.getX()); 
    System.out.println("a2.getY()=" + a2.getY()); 
    System.out.println("((B)a2).getY()=" + ((B)a2).getY()); 
    System.out.println("((B)a2).x=" + ((B)a2).x); 
    System.out.println("a3 is A: " + (a3.getClass() == A.class)); 
    System.out.println("a3 is B: " + (a3 instanceof B)); 
    System.out.println("a3==a2: " + (a3 == a2)); 
} 

我的問題是與a2a3對象, a3基本上是a2.get2(),下面將達到返回thisAget1()方法的方法之後。

由於該方法在A我確信它只會參考參考返回對象a2A一部分,而不是整個對象類,發現

所以,當我嘗試這條線: A3。 getClass()== A.class 我將得到True

當我調試a3.getClass()是「B類」。

有人可以向我解釋return this行在父類中的實際情況嗎?

謝謝!

+2

什麼是'a2'和'a3'?你所說的'a3'基本上是'a2.get2()'。遵循該方法後,你的意思是什麼?請提供所有相關信息。 – CKing

+0

那麼,忘記「我確信它只會返回對'A'部分的引用。 Java中沒有對象的部分引用。 – laune

+0

請不要在沒有修改代碼的情況下發布諸如「我將獲得'True'」之類的語句。 – laune

回答

2

讓我們追溯報表一步一步:

  1. a1A類型的實例的引用。
  2. a1.get2()調用Aget2()方法,該方法返回到B類型的實例的引用,以便a2B類型的實例。
  3. a2.get2()B中調用get2()方法。請記住,a2B類型的一個實例,因此this指的是B
  4. get2()方法B調用B中的get1()方法。 this仍指B
  5. get1()方法B調用super.get1()。這是它可能會有點混亂的地方。即使您從父類調用get1方法,this仍然在運行時引用B。因此,super.get1()返回Bget1()B返回Bget2()B返回B。因此,a3是指B類型的實例。

從Java文檔爲Object#getClass

公共最終級的getClass()

返回運行時類此Object

getClass方法返回運行時類的對象,所以當您通過對B類型的實例的引用調用getClass時,會得到相應的結果。如果getClass不是爲了返回實際的實例類型而設計的,它總會返回Object,這會使方法變得毫無意義。

1

關鍵字this引用當前對象實例。沒有「B對象的一部分」,即從子類中沒有對超類的引用。繼承的對象不會被分成不同的部分;你實例化一個對象,並且它在實例方法中由this引用,而不管這些實例方法在哪裏聲明。

因此,您在A中聲明的方法中有一個B對象和this。如果方法直接或間接地從B調用,那麼它將引用該B對象。