У меня есть следующие две объектные переменные
Date a;
Date b=null;
Определенно и «a», и «b» не относятся ни к каким объектам.
Теперь, если я призываю следующее утверждение
System.out.println(a.toString());
Там будет ошибка времени компиляции, тогда как, если я вызову следующее утверждение
System.out.println(b.toString());
Не будет ошибки времени компиляции, но будет ошибка времени выполнения. В чем причина этого, и какое значение будет фактически сохранено в 'b', чтобы представить нулевое значение?
Ответы:
Это потому, что состояние локальных переменных контролируется в рамках своей области
Что не так для полей
Теперь, почему хорошо установить переменную в null и использовать ее немедленно? может быть, это историческая ошибка, которая иногда приводит к ужасным ошибкам
Теперь в чем семантическая разница?
просто объявляет переменную, которая может содержать ссылку, которая указывает на объект типа
Date
, однакоделает то же самое, но ссылка на этот раз указывает на ноль, ноль, как и любая ссылка, занимает пространство собственного указателя, то есть 4 байта на 32-битных машинах и 8 байтов на 64-битных машинах
источник
Для полей классов нет никакой разницы. Они
null
по умолчанию для объектов, 0 для числовых значений иfalse
логических значений.Для переменных, объявленных в методах - Java требует их инициализации. Не инициализация их вызывает ошибку времени компиляции при обращении к ним.
В чем причина? Поля класса могут быть изменены любым методом. В любом порядке метод вызывается. Все не приватные поля могут быть изменены другими классами и / или классами, расширяющими этот класс. Следовательно, нет смысла уведомлять о неинициализированной переменной, поскольку она может быть назначена во многих местах.
Переменные внутри методов, однако, являются локальными и могут быть изменены только внутри самого метода. Следовательно, возможно и рационально указать возможные ошибки. И компилятор пытается это сделать. Если он знает, что поле не инициализировано, он покажет ошибку, потому что это никогда не то, что вы хотите. Если он не уверен - он выдаст предупреждение, чтобы вы могли убедиться.
источник