2014-02-21 3 views
1

В Java, вы не можете сделать этоFoward ссылающихся типы в Java

Object x = y; 
Object y = null; 

Но вы можете сделать это:

class A { B bref = null; } 
class B {} 

Почему это так? Может ли кто-нибудь объяснить, как во втором случае компилятор знает о B?

+0

Вы можете задать тот же вопрос о структуре с похожими списками 'class A {A aref = null;}'. – arshajii

ответ

-1

В первом случае вы не указали ссылку y до x. Из-за этого компилятор не знает, что представляет y. Во втором случае у вас есть ссылка типа B на null, так что все в порядке. Если бы вы не поместили null, все равно будет тем же, поскольку объекты-члены экземпляра по умолчанию заданы как null. Это пример композиции.

+1

Нет, это неправильно. Когда тип компилятора проверяет блок декларации 'A', он увидит' B' как новый тип, о котором он не знал. Не имеет значения, на что я его устанавливал. –

+0

Этого не может быть, это пример кода, который компилирует нормально: 'code'public класс TestClass { } класса А {B исх = NULL;} класс B {}' code' – Slimu

+0

Я не сделал скажем, что код не собирался компилироваться. Я сказал, что ваше объяснение неверно. –

1

В первом блоке:

Object x = y; 
Object y = null; 

Вы сначала объявить x равным y, это будет только компилировать тогда и только тогда, когда y был объявлен.
Во второй строке вы объявляете Object ynull, tis будет компилироваться, только если y не был объявлен ранее.

Следовательно, ваше первое утверждение никогда не сможет скомпилировать и не имеет смысла.

Теперь на втором блоке:

class A { B bref = null; } 
class B {} 

Здесь вы создаете, пакет частного класса A, который имеет в качестве частного пакета члена переменную класса B (независимо от B может быть, до тех пор, как B присутствует в исходных файлах), то есть null при инициализации. Класс также имеет открытый конструктор, который не делает ничего существенного.
Затем вы создаете пакет private class B, который имеет только открытый конструктор.

Вы ничего не делаете в своем коде, и все это полностью допустимая Java.

Вы можете делать то, что делаете, потому что это все допустимый синтаксис Java.
Кроме того, компилятор знает о B, потому что он сначала компилирует ваши файлы, и поэтому все классы присутствуют и известны.

Смежные вопросы