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