Здесь я рассматриваю несколько случаев, через которые вы можете очистить концепцию
1. ArrayList<String> arr = new ArrayList<String>();
2. ArrayList<String> arr = new ArrayList();
3. ArrayList arr = new ArrayList<String>();
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)
В этом случае 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
.
Предупреждение: - Объект типа
blockquote>Raw
ссылается на типStrict
Referenced VariableArrayList
.Случай 3
В этом случае
ArrayList arr
является сырым типом, но ваш Objectnew ArrayList<String>();
является строгим типом.arr.add("hello"); arr.add(23); //compiles fine but raise the warning.
Он добавит в него любой тип объекта, потому что
arr
является сырым типом.Внимание: - A
blockquote>Strict
Тип Объект ссылается на araw
тип, на который ссылается переменная.
static
с именем класса является законным, но его нет, было написано, что вы не можете получить доступ к элементу static
, используя ссылочную переменную объекта. Таким образом, он работает здесь. null
разрешена для доступа к переменной класса static
без исключения исключения либо в момент компиляции, либо во время выполнения. Когда вы когда-либо обращаетесь к статической переменной или методу с объектами во время компиляции, она преобразуется в имя класса. например:
Main main = null;
System.out.println(main.value);
Он выведет значение значения статической переменной, потому что во время компиляции он будет преобразован в
System.out.println(Main.value);
. Доказательство:
скачать декомпилятор и декомпилировать ваш .class-файл в .java-файл, и вы можете увидеть, что все статические методы или имя объекта, присвоенное переменной, автоматически заменяются именем класса.
Поскольку, как вы сказали, статические поля не связаны с экземпляром.
Возможность доступа к статическим полям из ссылки экземпляра (как вы это делаете) является просто синтаксическим сахаром и не имеет дополнительных имея в виду. Ваш код компилируется в
main.getNull();
Main.value