2016-01-12 13 views
26

這是一個培訓練習,用於理解Java中內部類的運作。正如問題所述,在(*)中可以訪問多少個不同版本的x(*)中可以訪問多少個不同版本的'x'?

class Outer { 
    int x; 

    class Inner extends Outer { 
     int x; 

     void f(int x) { 
      (*) 
     } 
    } 
} 

我傾向於認爲,有3個,分別爲:this.xsuper.xx但有些我的同齡人似乎認爲,有4

我們中的困惑?你能解釋一下嗎?

+16

Bleaaah,代碼亂七八糟。但是我傾向於4,將'Outer.this.x'與'super.x'區分開來,因爲'Outer'既是超類型又是封閉類型,而且這兩者是截然不同的。 –

+1

正確。用'Outer a = new Outer();內部b = a.new內部();''有4個。 –

+0

一些更多的句法形式 - 'Inner.super.x','((Outer)this).x' – ZhongYu

回答

30

有4個,即:x,this.x,super.xOuter.this.x

考慮以下幾點:

public class Outer { 

    int x; 

    public static void main(String[] args) { 
     Outer outer = new Outer(); 
     Outer.Inner inner = outer.new Inner(); 
     outer.x = 3; 
     inner.x = 2; 
     inner.f(1); 
    } 

    class Inner extends Outer { 
     int x; 

     void f(int x) { 
      System.out.println(super.x); 
      System.out.println(x); 
      System.out.println(this.x); 
      System.out.println(Outer.this.x); 
     } 
    } 

} 

此代碼將打印

0 
1 
2 
3 

示出4個不同的值。

發生了什麼事是以下幾點:inner實例

  1. ,家長有一個未初始化變量x。對於int,默認值爲0:這是super.x
  2. 方法f與參數1調用:這是x
  3. 實例inner已將其x設置爲2,並且inner.x = 2:這是this.x
  4. outer實例,即Outer.this被設置爲x的值爲3:這是Outer.this.x

的這裏訣竅是,Inner既是inner class(所以它有一個封閉Outer實例)和一個​​(所以它有一個父Outer實例),並且在這兩個Outer實例是不一樣的。

+0

Re:「a [subclass](https://docs.oracle.com/javase/specs/jls/se8 /html/jls-8.html#jls-8.1.4)(所以它有一個父'Outer'實例)「:這應該是」一個[子類](https://docs.oracle.com/javase/specs /jls/se8/html/jls-8.html#jls-8.1.4)(所以它本身就是一個'Outer'實例)「。 (或者:「a [subclass](https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.1.4)(所以它的實例本身就是'Outer '實例)「)。 – ruakh

10

有他們四個人:

  • Outer.this.xOuter類屬性
  • this.xInner類屬性
  • super.x爲超級Outer型類屬性
  • x的方法參數
相關問題