我了解到,要访问静态成员类,语法为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();
}
}
我如何理解这一点?
答案 0 :(得分:4)
来自Java语言规范,concerning members of an interface type
接口的主体可以声明接口的成员,即 是,字段(§9.3),方法(§9.4),类(§9.5)和接口 (第9.5节)。
由a声明或继承的成员
m
的声明范围 类类型C
(第8.1.6节)是C
的整个主体,包括任何嵌套的类 类型声明。
类类型的成员都是以下所有:
- [..]
- 从任何直接超接口继承的成员(第8.1.5节)
因此,TouchEvent
类型在类型Input
中声明。它是Input
的成员。 Keyboard
实现Input
,因此继承其成员。因此,TouchEvent
属于Keyboard
的范围。因此,您无需使用其封闭类型限定其使用。
答案 1 :(得分:0)
引自doc:
成员(第8.2节)的范围(第6.3节)是整个主体 该成员所属的类的声明。场,方法, 成员类,成员接口和构造函数声明可以 包括访问修饰符(第6.6节)public,protected或private。的的 类的成员包括声明和继承的成员(§8.2)
因此,它表示类Keyboard
在其范围内也有Input
成员,可以直接访问它们。
由于您的班级Keyboard
实施了界面Input
,这意味着Keyboard
Input
。并且它将能够直接访问静态嵌套类,而无需使用外部接口的引用。默认情况下,所有接口字段也是静态的,但实现类可以直接访问它们。
但是当您尝试在NestedClassInInterface
(不是Input
)中访问它时,它需要引用外部类/接口,在这种情况下为Input
。您可以尝试从implements Input
的声明中删除Keyboard
,并查看我的意思。