2015-09-09 281 views
1

我瞭解到,要訪問靜態成員類,語法是OuterClass.NestedStaticClass。下面訪問靜態成員類

對於以下接口Input給定的,

interface Input{ 

    static class KeyEvent{ 
     public static final int KEY_DOWN = 0; 
     public static final int KEY_UP = 0; 
     public int type; 
     public int keyCode; 
     public int keyChar; 
    } 

    static class TouchEvent{ 
     public static final int TOUCH_DOWN = 0; 
     public static final int TOUCH_UP =0; 
     public static final int TOUCH_DRAGGED = 2; 
     public int type; 
     public int x, y; 
     public int pointer; 
    } 

    public boolean isKeyPressed(int keyCode); 
    ..... 
    public List<KeyEvent> getKeyEvents(); 
    public List<TouchEvent> getTouchEvents(); 
} 

是實現Keyboard

class Keyboard implements Input{ 

    .... 

    @Override 
    public List<TouchEvent> getTouchEvents() { 
     TouchEvent obj1 = new TouchEvent(); 
     TouchEvent obj2 = new TouchEvent(); 
     List<TouchEvent> list = new ArrayList<TouchEvent>(); 
     list.add(obj1); 
     list.add(obj2); 
     return list; 
    } 

} 

在此實現Keyboard,我並不需要使用Input.TouchEvent低於行代碼。

TouchEvent obj1 = new TouchEvent(); 
TouchEvent obj2 = new TouchEvent(); 
List<TouchEvent> list = new ArrayList<TouchEvent>(); 

但下面執行,我不得不用Input.TouchEvent

public class NestedClassInInterface { 
    public static void main(String[] args) { 
     Input.TouchEvent t = new Input.TouchEvent(); 
    } 
} 

如何理解?

+2

因爲要實現在你前面的情況接口'input' .. – Babel

+0

如果您實現接口'Input',如何訪問的範圍'KeyEvent'不同? – overexchange

回答

4

從Java語言規範,concerning members of an interface type

的接口可宣佈該接口的成員的主體,即 是,字段(第9.3節),方法(第9.4節),類(§9.5)和接口 (第9.5節)。

和關於一個構件m中聲明或由 類類型C(第8.1節繼承的聲明的scope of a declaration

範圍。6)是C的整個主體,包括任何嵌套的 類型聲明。

concerning class members

的類類型的成員是以下所有:

  • [..]
  • 成員的任何直接超接口繼承的(§8.1.5 )

因此,類型TouchEventInput類型中聲明。它是Input的成員。 Keyboard implements Input因此繼承其成員。 TouchEvent因此在Keyboard的範圍內。因此,您不需要使用其封裝類型來限定其用途。

+0

*包括任何嵌套類型聲明*謝謝 – overexchange

+1

@overxchange我認爲你誤解了這一點。在那個引用中,'m'是'TouchEvent'類型,''''是'Keyboard'。 _any嵌套type_引用在'C'中聲明的成員類,而不是'TouchEvent'。換句話說,如果'Keyboard'有一個嵌套類,嵌套類的主體也可以使用簡單名稱'TouchEvent',因爲它將在範圍內。 –

0

doc引用:

範圍(§6.3)的構件(第8.2節)是 聲明該成員所屬的類的整個身體。成員類,成員接口和構造函數聲明的字段,方法, 可能包含訪問修飾符(第6.6節)public,protected或private。 一類的 成員包括申報和繼承的成員(第8.2節)

因此,這意味着類Keyboard也有Input成員在其範圍內,可以直接訪問它們。

當你的Keyboard類實現接口Input這意味着KeyboardInput。並且它將能夠直接訪問靜態嵌套類而不使用外部接口的引用。所有接口字段默認也是靜態的,但實現類可以直接訪問它們。

但是,當您嘗試訪問它NestedClassInInterface(這是不是Input)它需要外部類/接口,在這種情況下Input的參考。您可以嘗試從Keyboard聲明中刪除implements Input,並會明白我的意思。

+0

@鍵盤擴展輸入時,'鍵盤'是'輸入'' – overexchange

+0

@過渡:'輸入'是這裏的一個接口。 –

+0

是的,這就是原因,我們使用'implements' – overexchange