2013-08-20 4 views
-3

Если класс A имеет ссылку класса B, а класс B имеет ссылку класса A, допустимо ли это на Java? Если да, то когда мы выполняем класс A по времени, класс B не будет создан. Итак, как компилятор выполнит ссылку класса B?Циклическая ссылка в java

TIA

+2

Вы уверены, что имеете в виду, что у классов есть ссылки? Вы имеете в виду, что объект класса 'A' ​​имеет ссылку на объект класса' B'? – chrylis

+3

Вы пробовали это? Вероятно, это займет меньше, чем вопрос. –

+1

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

ответ

1

Это совершенно нормально.

Объект A может ссылаться на объект B, а объект B может ссылаться на объект A. Фактически вы видите это на графиках кода часто, когда узел ссылается на весь граф, а граф ссылается на множество узлов.

3

Если класс A имеет ссылку класса B, а класс B имеет ссылку на класс A, допустимо ли это на Java?

Да.

Когда мы выполняем класс A по времени, класс B не будет создан. Итак, как компилятор выполнит ссылку класса B?

Вы должны создать циклическую ссылку, создав сначала один объект, а затем другой, а затем завершающий цикл; например что-то вроде этого.

A a = new A(); 
B b = new B(a); 
a.setB(b); 

(Это предполагает, что A класс был определен с помощью метода setB(A). Существуют и другие способы, чтобы сформировать цикл тоже, но это самый простой.)


Но обратите внимание, что ваш терминология - все это совершенно неправильно.

  • Вы не выполняете класс. Вы экземпляр или создать экземпляр класс.
  • Компилятор (например, javac) не «выполняет» что-либо ... это просто компилирует код.
  • Дело в том, что выполняет (т. Е. работает) Java-код является виртуальной машиной Java; например когда вы используете команду java.

(Важно, чтобы вы изучить и использовать правильную терминологию Java, если вы собираетесь общаться с другими ИТ-специалистами. Это позволяет избежать много недопонимания и путаницы!)

+0

Вы можете протекать 'this' из конструктора A:' new B (this) '. На практике это очень часто происходит в (плохо написанном) графическом коде. –

+0

@MarkoTopolnik - Это правда (если я правильно понимаю, что вы имеете в виду) ... но я стараюсь, чтобы это было просто. –

+0

Это тоже халатность, поэтому вы держите ее в чистоте одновременно :) –

0

Да, это приемлемо, в так как компилятор хранит вызовы другого класса в качестве имени метода плюс подпись: типы параметров, снова как текст.

Я даже видел следующего ужас

interface A { 
    final A = new B(); 
} 

class B implements A { 
} 

Java является слабосвязанным; возникают соответствующие исключения времени выполнения. То же самое компилируется в отношении другой версии библиотеки jar и работает с банкой со сломанным API.