Использование статических членов во внутренних классах в Java - PullRequest
0 голосов
/ 20 октября 2019

Я узнал, что внутренние классы в java не могут иметь статических членов, пока они не будут объявлены как final. Но разве теоретически нельзя объявить статические члены в локальном классе?

Например,

public class OuterClass
{
  class innerClass
  {
    public static int i = 1;
  // inner class code goes here
  }
}

Я знаю, что стандартная инициализация внутреннего класса происходит следующим образом:

OuterClass outerClass = new OuterClass();
OuterClass.innerClass innerclassInstance = outerClass.new innerClass();

Но почему бы и нет?

OuterClass outerClass = new OuterClass();
outerClass.innerClass innerclassInstance = new outerClass.innerClass();

Когда создается экземпляр OuterClass, он также содержит копию innerClass. Поэтому, если статическим (просто статическим, но не конечным) элементам было разрешено присутствовать во innerClass, тогда к ним должен (или может быть) осуществляться доступ таким образом

outerClassInstance.innerClass.member

Am Iдумать в неправильном направлении? Есть ли какая-то конкретная причина, по которой внутренние классы были спроектированы такими, какие они есть?

Надеюсь, мне ясно. Извините за мой плохой английский.

1 Ответ

1 голос
/ 20 октября 2019

Но разве теоретически невозможно объявить статические члены в локальном классе?

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

Давайте представим, что вы не объявляете 'i' как final, и вы создаете экземпляры a и b класса OuterClass, два экземпляранезависимы друг от друга. Мы можем установить:

OuterClass a = new OuterClass();
OuterClass.InnerClass a1 = a.new InnerClass();
a1.i = 9;

OuterClass b = new OuterClass();
OuterClass.InnerClass b1 = b.new InnerClass();
b1.i = 18;

Хм, статическая переменная с двумя различными значениями, существует параллельно, не зависит друг от друга (потому что a и b не зависят друг от друга).

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

Но почему бы и нет ??

OuterClass outer = new OuterClass(); //I modified the variable name to avoid confusion
outer.InnerClass innerclassInstance = new outer.InnerClass();

По соглашению

Type name = new Type();

, поэтому внешний (имя) не может быть преобразован в тип.

Вы можете сделать это следующим образом:

OuterClass.InnerClass innerclassInstance = new OuterClass().new InnerClass();

Надеюсь, мой ответ может помочь вам.

...