2015-09-09 235 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