2016-04-26 4 views
1

В приведенном ниже коде мы можем доказать, что интерфейсы могут иметь статический класс и нестатический класс, объявленные внутри (статический вложенный класс и внутренний класс). Хорошо, ничего нового. Но в чем разница между «вложенными» и «внутренними» классами (внутри интерфейсов), если «внутренний» класс может иметь экземпляр без экземпляра внешнего класса, даже в интерфейсах Implemtations (MyInterfImpl в коде ниже) ?В чем разница между статическим классом, а не статическим классом внутри интерфейсов?

я прокомментировал линии на код, чтобы «изюминка»:

public class NewTest { 

    public static void main(String[] args) { 

     // OK Compilation Fail on next line, here we can't have an Instance of inner class because we don't have 
     // instance of outer class, nothing strange to me 
     MyClass.MyInner inner = new MyClass.MyInner(); //COMPILE FAIL: must be new MyClass().new MyInner() instead 
     MyClass.MyNested nested = new MyClass.MyNested(); // OK here, its nested 

     MyInterf.MyInner inner2 = new MyInterf.MyInner(); // HERE, MyInner is Inner class, ins't it? 
     MyInterf.MyNested nested2 = new MyInterf.MyNested(); // OK here, its nested 

     MyInterfImpl.MyInner inner3 = new MyInterfImpl.MyInner(); // // HERE, MyInner is Inner class, ins't it? 
     MyInterfImpl.MyNested nested3 = new MyInterfImpl.MyNested(); // // OK here, its nested 

    } 




} 

interface MyInterf{ 

    public static class MyNested{ 

    } // end 

    public class MyInner{ 

    }// 

    // some abstract methods.... 
} 

class MyClass{ 
    public static class MyNested{ 

    } // end 

    public class MyInner{ 

    }// end 
} 

class MyInterfImpl implements MyInterf{ 

} 
+0

класс в интерфейсе ??? общие .. AFAIK, 'public' и' static' модификаторы являются излишними в интерфейсе –

+0

Привет, я не уверен, правильно ли я понял ваш вопрос, поэтому, если не сообщите мне об этом. Генеральный контракт на использование статических методов не требует нового ключевого слова, предназначенного для создания экземпляров. , чтобы мы могли ожидать MyClass.MyInner(); для работы, но он также не будет компилироваться, так как MyInner не является статичным, а затем он должен быть доступен только с областью экземпляров, а затем он будет работать снова, используя: новый MyClass(). MyInner(); С другой стороны, новый MyInterf.MyNested() будет работать, поскольку интерфейсы объявляют вещи неявно статическими. (как сказал также Туфир) Надеюсь, что поможет –

ответ

1

С this answer по Nad Nik: Классы внутри интерфейсов являются на самом деле неявно как static и public. Итак, MyInterf.MyInner() отлично работает, так как MyInterf.MyInner фактически статичен.

Редактировать Благодаря Andreas за указание в comment, что MyInterf.MyInner является статический вложенный класс, не внутренний класс.

Источник: Java spec, sec. 9.5

Друг, я надеюсь, что вы не сидите спиной к любой двери. :)

+0

Почему вы не проголосовали так близко, как дубликат? –

+1

* «Внутренние классы внутри интерфейсов фактически неявно статичны» * - это противоречие в терминах. Внутренний класс * определяется как * нестатический вложенный класс *. «Static» означает, что не может быть * внутренним классом *, но является * вложенным классом *; более конкретно * статический вложенный класс *. См. [JLS 8.1.3 - Внутренние классы и экземпляры Enclosing Instances] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.1.3): Внутренний class * - это вложенный класс, который ** не ** явно или ** неявно объявлен 'static' **. – Andreas

+0

@ Обновлено Andreas - спасибо! – cxw