Подтвердить что ты не робот

Почему внутренние классы не могут объявлять статические члены?

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

Потому что Java Language Specification говорит так:

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

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

Ответ 3

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

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

будет компилироваться и работать отлично

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

Ответ 4

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

public class A {

   public static class B {

       private static JPanel myJPanel;

   }

}