[英]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.