为什么在java中嵌套抽象类



我想知道嵌套抽象类意味着什么?例如

abstract class A{
abstract class B{
}
}

是否有我们可能需要的用例或场景,例如设计?或者这种模式中有什么有用的东西吗?为什么Java允许我们这么做?

在设计中,您希望基类class A只为其派生类提供一个接口。这意味着,您不希望任何人实际实例化基类的对象。您只想向它上转换(隐式上转换,它为您提供多态行为),这样就可以使用它的接口。这是通过使用abstract关键字使类抽象来实现的。另一方面,您希望只使用class A的部分功能,因此创建class B(作为子级)以减少系统之间的耦合或实现依赖关系,并防止重复

但请记住,当您定义内部类时,没有内部类的代码更易于维护和可读。当您访问外部类的私有数据成员时,JDK编译器会在外部类中创建包访问成员函数,以便内部类访问私有成员。这留下了一个安全漏洞。一般来说,我们应该避免使用内部类。只有当内部类仅与外部类的上下文相关时才使用内部类,并且/或者内部类可以设置为私有的,以便只有外部类才能访问它。内部类主要用于实现外部类上下文中使用的辅助类,如Iterator、Comparator等。关于abstract class,它对助手来说应该是抽象的,假设您的助手应该太复杂,无法为它们编写抽象表单。

在您的案例中,我不记得嵌套抽象类的广泛使用,可能在Swing世界中。

抽象类用于提供类的部分实现以进行继承。它允许您在不提供完整定义的情况下定义类的方案,以便可以在子类中指定它。它的工作原理有点像接口,因为你可以对从它派生的任何类的实例执行抽象类中指定的任何操作。嵌套的抽象类被设计为由其他内部类(我认为甚至是匿名类)继承,而不是由最外层类外定义的类继承。

public class HelloEveryone{
abstract class Hello{
void SayHello(){
System.out.println("Hello!");
}
abstract void SayHelloAlt();
}
public class HelloWorld extends Hello{
public void SayHelloAlt(){
System.out.println("HelloWorld!");
} 
}
public class HelloUniverse extends Hello{
public void SayHelloAlt(){
System.out.println("HelloUniverse!");
} 
}
void Go(){
ArrayList<Hello> hellos = new ArrayList<Hello>();
hellos.add(new HelloWorld());
hellos.add(new HelloUniverse());

for (Hello h : hellos){
h.SayHello();
h.SayHelloAlt();
}
}   
}
static void main(){
HelloEveryone hello = new HelloEveryone();
hello.Go();
}

最新更新