В некоторых случаях в Java внутренний класс расширяет внешний класс.
Например, java.awt.geom.Arc2D.Float является внутренним классом java.awt.geom.Arc2D, итакже расширяет Arc2D.(cf 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. Я нашел обходной путь, но я просто не могу понять, почему он был разработан таким образом.)