Основная концепция java Oops [duplicate]

Здесь я рассматриваю несколько случаев, через которые вы можете очистить концепцию

1. ArrayList<String> arr = new ArrayList<String>();
2. ArrayList<String> arr = new ArrayList();
3. ArrayList arr = new ArrayList<String>();

Случай 1

ArrayList<String> arr является ссылочной переменной ArrayList с типом String, которые ссылаются на объект ArralyList типа String. Это означает, что он может содержать только объект типа String.

Строго для String не для Raw Type, поэтому он никогда не будет предупреждать.

    arr.add("hello");// alone statement will compile successfully and no warning.

    arr.add(23);  //prone to compile time error.
     //error: no suitable method found for add(int)

Случай 2

В этом случае ArrayList<String> arr является строгим типом, но ваш объект new ArrayList(); является сырым типом.

    arr.add("hello"); //alone this compile but raise the warning.
    arr.add(23);  //again prone to compile time error.
    //error: no suitable method found for add(int)

здесь arr является строгим типом. Таким образом, он будет поднимать ошибку времени компиляции при добавлении integer.

Предупреждение: - Объект типа Raw ссылается на тип Strict Referenced Variable ArrayList.

Случай 3

В этом случае ArrayList arr является сырым типом, но ваш Object new ArrayList<String>(); является строгим типом.

    arr.add("hello");  
    arr.add(23);  //compiles fine but raise the warning.

Он добавит в него любой тип объекта, потому что arr является сырым типом.

Внимание: - A Strict Тип Объект ссылается на a raw тип, на который ссылается переменная.

116
задан Tiny 11 February 2014 в 21:08
поделиться

4 ответа

  1. Доступ к члену static с именем класса является законным, но его нет, было написано, что вы не можете получить доступ к элементу static, используя ссылочную переменную объекта. Таким образом, он работает здесь.
  2. Референс-переменная объекта null разрешена для доступа к переменной класса static без исключения исключения либо в момент компиляции, либо во время выполнения.
3
ответ дан Lion 21 August 2018 в 08:04
поделиться

Когда вы когда-либо обращаетесь к статической переменной или методу с объектами во время компиляции, она преобразуется в имя класса. например:

Main main = null;
System.out.println(main.value);

Он выведет значение значения статической переменной, потому что во время компиляции он будет преобразован в

System.out.println(Main.value);

. Доказательство:

скачать декомпилятор и декомпилировать ваш .class-файл в .java-файл, и вы можете увидеть, что все статические методы или имя объекта, присвоенное переменной, автоматически заменяются именем класса.

3
ответ дан Rais Alam 21 August 2018 в 08:04
поделиться

Поскольку, как вы сказали, статические поля не связаны с экземпляром.

Возможность доступа к статическим полям из ссылки экземпляра (как вы это делаете) является просто синтаксическим сахаром и не имеет дополнительных имея в виду. Ваш код компилируется в

main.getNull(); 
Main.value
19
ответ дан Tiny 21 August 2018 в 08:04
поделиться
  • 1
    Если у кого-то есть информация о why , этот выбор был сделан, это было бы интересно. – user 20 July 2012 в 16:58
  • 2
    @JonofAllTrades Я думаю, что это очевидно: разумно не бросать никаких исключений при вызове нулевой ссылки, потому что это не имеет значения, поскольку метод статичен. – Malcolm 20 July 2012 в 18:01
  • 3
    Я бы назвал его синтаксическим сахаром, больше похожим на синтаксическую пилу;) – Stephen Swensen 21 July 2012 в 02:52
  • 4
    @JonofAllTrades: реальный вопрос заключается в том, почему был сделан выбор разрешения статических членов как экземпляра ... Мне кажется, что это приводит только к путанице и менее читаемому коду. – Falanwe 24 July 2012 в 19:52
  • 5
    @Falanwe: Согласен, и это конструкция, для которой у меня не было необходимости, хотя я в основном работаю в .NET, где это запрещено. Вероятно, вы захотите вызвать соответствующий статический метод подкласса, когда вам дается ссылка на родительский класс. – user 24 July 2012 в 21:09
  • 6
    @Falanwe Это разрешено, но вызывает предупреждение в Eclipse: «Статическое поле Main.value должно быть доступным статическим способом». По крайней мере, те из нас, кто придирчивы к предупреждениям (например, мне), избегают такого кода. – Artyom 25 July 2012 в 15:25
2
ответ дан user 21 August 2018 в 08:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: