В первом блоке:
Object x = y;
Object y = null;
Вы сначала объявить x
равным y
, это будет только компилировать тогда и только тогда, когда y
был объявлен.
Во второй строке вы объявляете Object y
null
, tis будет компилироваться, только если y
не был объявлен ранее.
Следовательно, ваше первое утверждение никогда не сможет скомпилировать и не имеет смысла.
Теперь на втором блоке:
class A { B bref = null; }
class B {}
Здесь вы создаете, пакет частного класса A
, который имеет в качестве частного пакета члена переменную класса B
(независимо от B
может быть, до тех пор, как B
присутствует в исходных файлах), то есть null
при инициализации. Класс также имеет открытый конструктор, который не делает ничего существенного.
Затем вы создаете пакет private class B
, который имеет только открытый конструктор.
Вы ничего не делаете в своем коде, и все это полностью допустимая Java.
Вы можете делать то, что делаете, потому что это все допустимый синтаксис Java.
Кроме того, компилятор знает о B
, потому что он сначала компилирует ваши файлы, и поэтому все классы присутствуют и известны.
Вы можете задать тот же вопрос о структуре с похожими списками 'class A {A aref = null;}'. – arshajii