簡體   English   中英

訪問靜態成員類

[英]Accessing static member class

我了解到,要訪問靜態成員類,語法為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();
    }
}

我怎么理解的?

來自Java語言規范, 涉及接口類型的成員

接口的主體可以聲明接口的成員,即字段(第9.3節),方法(第9.4節),類(第9.5節)和接口(第9.5節)。

並涉及聲明范圍

的成員的聲明的范圍m中聲明或由類繼承的類型C (§8.1.6)是整個身體C ,包括任何嵌套類型聲明。

關於班級成員

類類型的成員包括以下所有:

  • [..]
  • 從任何直接超級接口繼承的成員(第8.1.5節)

因此,類型TouchEvent在類型Input聲明。 它是Input的成員。 Keyboard實現了Input ,因此繼承了其成員。 因此, TouchEvent屬於Keyboard范圍。 因此,您不需要使用其封閉類型來限定其用途。

引用自doc

成員(§8.2)的范圍(§6.3)是該成員所屬類的聲明的整個主體。 字段,方法,成員類,成員接口和構造函數聲明可以包括公共,受保護或私有的訪問修飾符(第6.6節)。 類的成員包括聲明的成員和繼承的成員 (第8.2節)

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

當您的類Keyboard實現接口Input ,意味着Keyboard Input 而且,無需使用外部接口即可直接訪問靜態嵌套類。 默認情況下,所有接口字段也是靜態的,但是實現類可以直接訪問它們。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM