Я знаю, что это старый, но он возник в проекте, над которым я недавно работал (просто младший разработчик делал что-то неожиданное - не было реальной причины для этого!), И я думаю, что некоторые ответы пропустили точка ..
Это не имеет ничего общего с нормальным полиморфизмом; Я думаю, что вопрос относится к случаю, когда код выглядит так:
class A {
B b; //odd reference here..
}
class B extends A {
}
Где подкласс используется в определении суперкласса. Насколько я могу судить, нет законной причины для написания чего-то подобного самостоятельно, однако причина, по которой язык позволяет вам это делать, заключается в том, что это требуется для некоторых базовых классов Java, например. Object
.
Например, хотя он не хранит ссылку на него, код для Object
создает и возвращает объект String
в методе по умолчанию toString
, однако String
является подклассом Object
.
Интересно отметить, что хотя это технически разрешено, не имеет смысла заставлять суперкласс создавать экземпляр подкласса в его конструкторе.
, например
class A {
B b;
A(){
b = new B();
}
}
class B extends A {
}
Это будет просто сбой из-за того, что он создает бесконечный цикл, так как конструктор B вызывает конструктор A, который вызывает конструктор B и т. Д.