访问静态成员类

时间:2015-09-09 03:30:17

标签: java nested-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();
    }
}

我如何理解这一点?

2 个答案:

答案 0 :(得分:4)

来自Java语言规范,concerning members of an interface type

  

接口的主体可以声明接口的成员,即   是,字段(§9.3),方法(§9.4),类(§9.5)和接口   (第9.5节)。

关于scope of a declaration

  

由a声明或继承的成员m的声明范围   类类型C(第8.1.6节)是C的整个主体,包括任何嵌套的类   类型声明。

concerning class members

  

类类型的成员都是以下所有:

     
      
  • [..]
  •   
  • 从任何直接超接口继承的成员(第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,并查看我的意思。