«Ключевое слово static не делает с объявлением класса то, что делает с переменной или объявлением метода». - PullRequest
1 голос
/ 15 февраля 2011

From: JavaWorld

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

  1. Это теория, может кто-нибудь придумать хороший практический пример того, почему мы должны это делать?(Пример в ссылке вполне мог быть примером внутреннего класса AFAIK).

  2. Также - причина вопроса - почему вообще двусмысленное имя, почему «повторное использование»слово static и дать ему другое значение?

Ответы [ 5 ]

4 голосов
/ 15 февраля 2011

Вы используете его, когда ваш класс естественным образом вложен, но не нуждается в автоматической магии $ этой родительской ссылки, которую имеет внутренний класс в Java. Каждый нестатический внутренний класс имеет встроенную ссылку на содержащий его экземпляр. Когда вам на самом деле не нужна эта ссылка, лучше ее не создавать. Это может привести к тому, что объекты останутся в памяти гораздо дольше, чем нужно, и это также может быть проблемой, когда вы начинаете сериализацию объектов / пытаетесь отправить их по сети и т. Д. Вы можете получить гораздо больший граф объектов, чем вы. ожидаемый или необходимый для сериализации!

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

Для # 2, как это отличается? Статический для поля или метода означает, что он является атрибутом определения класса, а не экземпляра. Вы можете получить доступ и использовать его, не имея экземпляра. Статика для вложенного класса также означает, что он является атрибутом определения класса, к которому вы можете обращаться и использовать его без экземпляра.

2 голосов
/ 15 февраля 2011
  1. Видимость классов верхнего уровня может быть общедоступной или пакетной; но видимость вложенного статического класса может быть также закрытой или защищенной. Объявление вложенных классов может также улучшить упаковку (структурирование) ваших классов и соотнести их зависимости, например Map.Entry. Хотя, это также может быть неоднозначным.

  2. Слово static означает, что экземпляр объявлен на уровне класса. Например, static int i объявляет целое число для класса. Класс верхнего уровня аналогичен объявлению класса на уровне класса.

1 голос
/ 15 февраля 2011

Общее значение static в этих контекстах «разрешается во время компиляции» (в отличие от необходимости искать их в экземпляре объекта и просматривать таблицу виртуальных методов). Это применимо к статическим методам, статическим переменным и статическим внутренним классам. Я думаю, именно это и происходит, когда автор компилятора выбирает ключевые слова для вашего языка, концептуально он группирует их все вместе как «материал, который я могу оптимизировать».

1 голос
/ 15 февраля 2011
  1. Это теория, может кто-нибудь придумать хороший практический пример того, почему нам нужно это сделать? (Пример в ссылке вполне мог быть примером внутреннего класса AFAIK).

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

Например: если у вас большой внешний класс, который создает Runnable для постановки в очередь в каком-либо списке задач, существование этого Runnable может стать единственной вещью, которая препятствует его сбору. Теперь внутренний класс вынуждает JVM хранить бесполезный кусок пространства кучи, который ему, возможно, придется переместиться из Эдема в пространство выживших, которое собрать гораздо сложнее.

  1. Также - причина вопроса - зачем вообще иметь неоднозначное имя, зачем «повторно использовать»> слово static и придавать ему другое значение?

Как бы вы предпочли это назвать? С точки зрения языка, использование статического не вызывает двусмысленности в грамматике. Для меня «статика» имеет смысл. Экземпляр внутреннего класса не является членом экземпляра внешнего класса или наоборот.

1 голос
/ 15 февраля 2011

Я могу ответить на ваш второй вопрос.

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

Например, final может использоваться для идентификации переменной, которая может быть инициализирована только один раз. У него есть и другие значения, например, определение методов, которые нельзя переопределить.

super и synchronized также используются в нескольких контекстах.

...