В Java есть некоторые случаи, когда внутренний класс расширяет внешний класс.
Например, java.awt.geom.Arc2D.Float - это внутренний класс java.awt .geom.Arc2D, а также расширяет Arc2D. (см. 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();
Edit 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";
}
}
}
Edit 2: Правильно было указано, что предложение в моем предыдущем редактировании было ошибочным, так как не удалось создать ExtensionTest вне пакета. Однако на выходных я еще раз подумал об этом, так что насчет следующего:
abstract class Test {
public class ExtensionTest extends AbstractTest {
@Override
String getString() {
return "hello world";
}
}
private abstract class AbstractTest {
abstract String getString();
}
}
По сути, лучший ответ, который я видел до сих пор, заключается в том, что расширение внутреннего класса его внешнего класса позволяет логике быть сгруппированы вместе. Однако я думаю, что это можно сделать без расширения.
На мой взгляд, создание класса, который может иметь бесконечное количество вложенных в него подклассов, кажется плохим. (Контекст: это возникло при попытке создать словарь для утилиты завершения кода и вызвало исключение StackOverflowException. Я нашел обходной путь, но просто не могу понять, почему он был разработан таким образом.)