В Java есть некоторые случаи, когда внутренний класс расширяет внешний класс.
Например, java.awt.geom.Arc2D.Float является внутренним классом java.awt.geom.Arc2D, а также расширяет Arc2D. (c.f. http://download.oracle.com/javase/6/docs/api/java/awt/geom/Arc2D.Float.html)
Кроме того, sun.org.mozilla.javascript.internal.FunctionNode.Jump расширяет sun.org.mozilla.javascript.internal.Node, который является суперклассом FunctionNode. (извините... не могу найти ссылку на javadoc)
Для меня это кажется странным. Не могли бы вы создать их?
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
Какая цель заключается в том, чтобы подкласс вложен как внутренний класс суперкласса?
Я задавался вопросом, нужно ли было получить доступ к чему-то в суперклассе, но если вы хотите получить доступ к любым переменным/методам в родительском, вы можете использовать
super.variable;
или
super.method();
Изменить 1: jjnguy предложил ему сохранить логику в одном и том же месте. В этом случае, почему бы вам не написать файл com.mypackage.AbstractTest:
abstract class AbstractTest {
abstract String getString();
}
class ExtensionTest extends AbstractTest {
@Override
String getString() {
return "hello world";
}
}
... а не:
abstract class AbstractTest {
abstract String getString();
class ExtensionTest extends AbstractTest {
@Override
String getString() {
return "hello world";
}
}
}
Изменить 2: Правильно было указано, что предложение в моем предыдущем редактировании было ошибочным, так как не удалось построить ExtensionTest за пределами пакета. Тем не менее, я думал об этом в течение выходных, так что о следующем:
abstract class Test {
public class ExtensionTest extends AbstractTest {
@Override
String getString() {
return "hello world";
}
}
private abstract class AbstractTest {
abstract String getString();
}
}
В сущности, лучший ответ, который я видел до сих пор, заключается в том, что если внутренний класс расширяет внешний класс, он позволяет группировать логику. Однако я думаю, что это можно сделать без расширения.
В моем сознании, кажется, что у плохого дизайна есть класс, который может иметь бесконечное число тех же подклассов, вложенных в него. (Контекст: это произошло, пытаясь создать словарь для утилиты завершения кода, и бросил исключение StackOverflowException. Я нашел обходное решение, но я просто не понимаю, почему он был спроектирован именно так.)