Java Inner Class estende a Outer Class
xistem alguns casos em Java em que uma classe interna estende uma classe extern
Por exemplo, java.awt.geom.Arc2D.Float é uma classe interna de java.awt.geom.Arc2D e também estende o Arc2D. (c.f.http: //download.oracle.com/javase/6/docs/api/java/awt/geom/Arc2D.Float.htm)
Além disso, sun.org.mozilla.javascript.internal.FunctionNode.Jump estende sun.org.mozilla.javascript.internal.Node, que é uma superclasse de FunctionNode. (desculpe ... não consigo encontrar um link para o javadoc)
Para mim, isso parece estranho. Você poderia criá-los?
new Arc2D.Float.Float() //n.b. I couldn't get this to compile in Intellij IDEA;
new FunctionNode.Jump.Jump.Jump(1); // I could get this to compile
Qual é a finalidade de aninhar uma subclasse como uma classe interna da superclass
Eu me perguntei se era para acessar algo na superclasse, mas se você quisesse acessar alguma variável / método no pai, poderia usar
super.variable;
o
super.method();
Edit 1: jjnguy sugeriu que é manter a lógica no mesmo lugar. Nesse caso, por que você não gravaria um arquivo com.mypackage.AbstractTest:
abstract class AbstractTest {
abstract String getString();
}
class ExtensionTest extends AbstractTest {
@Override
String getString() {
return "hello world";
}
}
... ao invés de
abstract class AbstractTest {
abstract String getString();
class ExtensionTest extends AbstractTest {
@Override
String getString() {
return "hello world";
}
}
}
Edit 2: Foi corretamente apontado que a sugestão na minha edição anterior foi falha, pois não foi possível construir o ExtensionTest fora do pacote. No entanto, eu pensei mais sobre isso no fim de semana, e o que se segue:
abstract class Test {
public class ExtensionTest extends AbstractTest {
@Override
String getString() {
return "hello world";
}
}
private abstract class AbstractTest {
abstract String getString();
}
}
Em essência, a melhor resposta que eu vi até agora é que ter uma classe interna estender sua classe externa permite que a lógica seja agrupada. No entanto, acho que isso pode ser feito sem a extensão.
Na minha opinião, parece um projeto ruim ter uma classe que pode ter um número infinito das mesmas subclasses aninhadas dentro dela. (Contexto: isso surgiu enquanto tentava produzir um dicionário para um utilitário de conclusão de código e lançou uma StackOverflowException. Encontrei uma solução alternativa, mas não consigo entender por que ele foi projetado dessa maneira.)