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

Происхождение синтаксиса Java для создания нового экземпляра внутреннего класса?

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

Синтаксис:

OuterClass.InnerClass innerObject = outerObject.new InnerClass();

Но почему это не так:

OuterClass.InnerClass innerObject = new outerObject.InnerClass(); 

Первое, по-видимому, означает, что new является методом или оператором, непосредственно связанным с классом, но я понимаю, что это не так (в отличие от С++)?

4b9b3361

Ответ 1

Последнее означало бы, что имя типа было outerObject.InnerClass - тогда как фактически имя типа просто InnerClass (или OuterClass.InnerClass, которое также было бы законным), построенное по отношению к экземпляру, на который ссылается outerObject.

Лично мне не нравится, как Java в первую очередь вставляет классы, и я согласен, что это выглядит немного странно, но я могу понять, почему это было сделано.

Ответ 2

Есть и другая причина.

new o.C(); 

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

Ответ 3

Внутренний класс является подмножеством во всех отношениях внутренней частью внешнего класса. Внутренний класс может получить доступ ко всем членам внешнего класса, как если бы они были такими. Точно так же экземпляр внутреннего класса (не static) должен быть неотъемлемой частью экземпляра внешнего класса. Он не может существовать сам по себе. Вы можете сравнить его с тем, как вы не можете получить доступ к нестатической переменной или функции с помощью MyClass.wyVariable.

Это поднимает точку, в которой путь является наиболее семантически правильным способом представления этого отношения.

OuterClass.InnerClass innerObject = new outerObject.InnerClass();

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

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

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

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

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

Обратите внимание, однако, что этот синтаксис отлично подходит для внутренних классов static, поскольку они не имеют особой связи ни с одним экземпляром внешнего класса. Это также отлично, когда экземпляр внутреннего класса внутри его внешнего класса.

Наконец,

OuterClass.InnerClass innerObject = outerObject.new InnerClass();

... лучше символизирует отношения. Он символизирует, что процесс создания экземпляра однозначно привязан к одному, конкретному внешнему объекту, что и происходит.