¿Qué significa tener una variable de instancia de árbol de superclase en una subclase de árbol no vacía?

Normalmente es legal crear variables de clase del tipo primario y asignarle objetos de un tipo secundario. La restricción en tales casos es que las personas que llaman solo pueden usar métodos y campos que son parte de la clase principal cuando se usa esa variable, los métodos extendidos y el estado no son visibles para los usuarios de la variable de clase primaria.

Por ejemplo: Tree foo = new Nonemptytree ();

Sin embargo, con las clases abstractas generalmente existe una regla de que no se pueden crear instancias (es decir, no se puede crear un objeto de la clase abstracta), por lo que la única forma legal de tener una variable del tipo de la clase abstracta es crear una instancia del niño clases que en sí mismas no son abstractas (implementa todos los métodos) para que no falte nada en tiempo de ejecución.

En otras palabras, no puede usar “nuevo árbol ()”.

En efecto, este es un polimorfismo forzado ya que la clase base abstracta no proporciona implementaciones de algunos de los métodos que declara, y depende de los niños proporcionarlos.