繁体   English   中英

访问静态成员类

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM