2015-09-09 4 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).

и относительно scope of a declaration

сферы действия декларации члена m объявленных или унаследованного с помощью типа класса C (пункта 8.1.6) - это весь объект C, включая любые вложенные объявления типа .

и concerning class members

членов типа класса являются все следующие:

  • [..]
  • Члены, унаследованные от любых прямых суперинтерфейсов (§8.1.5)

Итак, тип TouchEvent указан в типе Input. Он входит в состав Input. Keyboard реализует Input и поэтому наследует его членов. TouchEvent есть поэтому в объеме в теле Keyboard. Поэтому вам не нужно квалифицировать его использование с его закрывающим типом.

+0

* включая любые объявления вложенных типов * спасибо – overexchange

+1

@overexchange Я думаю, вы неправильно это понимаете. В этой цитате 'm' является типом' TouchEvent', 'C'' 'Keyboard'. _any вложенный тип_ относится к классу-члену, объявленному в 'C', а не' TouchEvent'. Другими словами, если 'Keyboard' имел вложенный класс, тело вложенного класса также могло бы использовать простое имя' TouchEvent', потому что оно было бы в области видимости. –

0

Цитируется doc:

Объем (§6.3) члена (§8.2) является все тело декларации класса, к которому принадлежит элемент. Поле, метод, объявления класса-члена, член-интерфейса и объявления конструктора могут содержать , включая модификаторы доступа (§6.6), общедоступные, защищенные или закрытые. В членах класса включают в себя как объявляются и унаследованными (§8.2)

Так это означает, что класс Keyboard также члены Input в объеме и может обращаться к ним напрямую.

В классе Keyboard реализует интерфейс Input это означает KeyboardявляетсяInput. И он сможет получить доступ к статическому вложенному классу напрямую, не используя ссылку внешнего интерфейса. По умолчанию все поля интерфейса статичны, но класс реализации может обращаться к ним напрямую.

Но при попытке получить к нему доступ в NestedClassInInterface (который не является Input), в этом случае ему требуется ссылка на внешний класс/интерфейс, который в этом случае равен . Вы можете попробовать удалить implements Input из объявления Keyboard и посмотреть, что я имею в виду.

+0

'Keyboard'' 'Input', когда' class Keyboard extends Input' – overexchange

+0

@overexchange: 'Input' - это интерфейс здесь. –

+0

да, это причина, мы используем 'implements' – overexchange

Смежные вопросы