Одно и то же ключевое слово для двух целей в Java? - PullRequest
6 голосов
/ 08 марта 2010

Поскольку мы используем ключевое слово «default» в качестве спецификатора доступа, и его можно использовать также в операторах switch с совершенно разными целями, поэтому мне было любопытно, есть ли в Java другие ключевые слова, которые можно использовать более чем в одном цели

Ответы [ 14 ]

13 голосов
/ 08 марта 2010

«По умолчанию» в случае модификатора доступа не является ключевым словом - вы не пишете:
default void doSomething()

Однако при указании по умолчанию значения атрибута аннотации - это так.

switch (a) {
   default: something();
}

и

public @interface MyAnnotation {
    boolean bool() default true;
}

Это, вместе с final, как указал Джон Скит, похоже, охватывает все. Возможно, кроме "перегруженного" ключевого слова for:

for (initializer; condition; step) и for (Type element : collection)

7 голосов
/ 08 марта 2010

Вы не можете использовать default в качестве спецификатора доступа, поэтому я не думаю, что это даже считается. (РЕДАКТИРОВАТЬ: как Божо указал, это может быть использовано в аннотациях.)

final означает «не может быть получено из / переопределено» и «только для чтения», которые имеют два разных - но связанных - значения.

4 голосов
/ 08 марта 2010
  • default может использоваться как в коммутаторе, так и в качестве значения по умолчанию в аннотации (как указывает Божо)
  • final означает «не может быть получено из / переопределено» и «только для чтения», которые имеют два разных - но связанных - значения (как указал Джон)
  • extends может использоваться как для указания супертипа класса, так и в подстановочных знаках и переменных типа для наложения ограничения (связанного, но не точно такого же) (List<? extends Foo>)
  • super может использоваться для указания чего-либо в суперклассе текущего класса или в подстановочном знаке для наложения ограничения (List<? super Foo>)
  • static означает и «часть класса, а не экземпляр» (для методов, атрибутов или инициализаторов) и как static import
  • class для объявления класса (class Foo {}) или для ссылки на литерал класса (Foo.class) (в ответе ILMTitan)
  • (for можно использовать в обычном цикле for и в «расширенном» для, но это больше похоже на перегрузку (как выразился Божо), чем на самом деле имеет два значения)
3 голосов
/ 08 марта 2010

Что-то еще никто не упомянул: ключевое слово class имеет два различных применения.

Объявление класса:

class Test{};

и указание литерала класса:

Class<Test> testClass = Test.class;
2 голосов
/ 08 марта 2010

Ключевое слово final может означать разные вещи.

  • При изменении classes означает, что класс нельзя разделить на подклассы.
  • При изменении method это означает, что метод не может быть переопределен.
  • При изменении variable это означает, что переменная не может указывать на любую другую переменную.
2 голосов
/ 08 марта 2010

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

public class MyClass
{
   private static int a;

   static
   {
      a = 1;
   }

   public static void doSomethingCool()
   {
      ...
   }
}

Комментарий Паскаля напомнил мне о статическом импорте:

import static MyClass.doSomethingCool;

public class MyOtherClass
{
   public void foo()
   {
      // Use the static method from MyClass
      doSomethingCool();
   }
}
2 голосов
/ 08 марта 2010

Ключевое слово default не используется в качестве спецификатора доступа. Отсутствие private, protected и public означает использование default.

Пример:

class Test { // default access for class.

 int A; // default access for the class member.
}

Вот несколько примеров использования ключевых слов Java:

  • final: final class не может быть разделен на подклассы, метод final не может быть переопределен, а переменная final может встречаться не более одного раза как выражение слева. *

  • Super: Используется для доступа к членам класса, унаследованного классом, в котором он появляется, также используется для переадресации вызова из конструктора в конструктор суперкласса.

  • Static: используется для создания static блоков инициализации, а также static элементов и static импорта.

  • for: Используется для обычного цикла for и более нового цикла Java 1.5 enhanced for.

0 голосов
/ 09 марта 2010

Кстати, в Java нет такого понятия, как спецификатор доступа. В JLS используется термин «модификатор доступа».

0 голосов
/ 08 марта 2010

Как уже говорилось во всех других ответах, есть много ключевых слов, которые служат различным целям в зависимости от контекста. Я просто хотел добавить, что для этого есть причина: существует сильное отвращение к добавлению ключевых слов, потому что такие добавления нарушают существующий код, поэтому при добавлении новых функций используются существующие ключевые слова, если они подходят, например супер и расширяемые для обобщений и по умолчанию для аннотаций, или они просто пропускаются, как в двоеточии, используемом в расширенном цикле for.

Так что я хочу сказать, что, поскольку язык продолжает развиваться, для существующих ключевых слов обнаруживается еще больше использования, чем для введения новых.

0 голосов
/ 08 марта 2010

Вы можете думать о следующих вещах

  1. По умолчанию
  2. окончательный
  3. супер
  4. ": " (двоеточие) используется в разных местах, что в разных местах имеет разное значение
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...