Почему внутренние классы не могут объявлять статические члены? - PullRequest
21 голосов
/ 19 декабря 2011

В руководстве по Java написано, что, поскольку внутренний класс связан с экземпляром включающего класса, он (внутренний класс) не может сам определять какие-либо статические члены.

Мне интересно, почему не может внутреннийклассы объявляют статические члены, например, какое-то поле private static, которое экземпляр этого внутреннего класса мог бы совместно использовать с другими экземплярами того же внутреннего класса?это просто реализация вещей в Java, которые нужно воспринимать как должное или что-то еще?

Ответы [ 4 ]

6 голосов
/ 19 декабря 2011

В основном просто произвольное решение.нет никакой причины, по которой не может быть поддерживаться, но на самом деле не существует веской причины к его поддержке.просто объявите статическое поле во внешнем классе.

также, эта кавычка может быть не совсем правильной: я считаю, что вы можете объявить статический serialVersionUID во внутреннем классе.

2 голосов
/ 19 декабря 2011

Поскольку в спецификации языка Java говорится так: :

Внутренний класс - это вложенный класс, который не является явно или неявно объявленным статическим.Внутренние классы не могут объявлять статические инициализаторы (§8.7) или интерфейсы-члены.Внутренние классы могут не объявлять статические члены, если только они не являются постоянными полями времени компиляции (§15.28).

Что касается , почему было указано таким образом, я не знаю.Я предполагаю, что внутренние классы были разработаны как маленькие вспомогательные классы, которые должны быть очень ограничены по сложности.

0 голосов
/ 24 июня 2014

Внутреннее class не может объявлять static поля, если они не являются константами времени компиляции. Следовательно, если вы объявите поле static как final, оно будет работать.

class Foo {
    class Test {
       final static int i = 10;
    }
}

отлично скомпилируется и запустится

static поля могут быть объявлены только в static или типах верхнего уровня. Следовательно, (чистая) переменная static может быть объявлена ​​только в static class.

0 голосов
/ 19 декабря 2011

Это может привести к конфликту интересов из-за наличия статической переменной-члена внутри внутреннего класса.Вообще говоря, внутренний класс должен иметь экземпляр объекта внешнего или включающего класса, прежде чем его можно будет создать.Статическая переменная-член предполагает, что вам даже не нужен экземпляр объекта для этого конкретного класса, в данном случае внутреннего класса, но этот класс зависит от внутреннего класса и может сосуществовать только вместе с экземпляром внешнего класса.Вы видите, где возникает конфликт интересов в споре?Однако вы можете сделать статическую переменную-член внутри внутреннего класса, объявив внутренний класс статическим, что означает, что внутреннему классу больше не нужно сосуществовать с объектом внешнего класса.

public class A {

   public static class B {

       private static JPanel myJPanel;

   }

}
...