在java中为什么嵌套抽象类(Why nested abstract class in java)

2019-07-03 22:45发布

我想知道这是什么意思有一个嵌套的抽象类? 例如,

   abstract class A{

          abstract class B{

          }
   }

是否有我们可能需要等设计的任何使用情况或情况? 或者是有很有用这样的模式的东西吗? 为什么Java允许我们这样做呢?

Answer 1:

在设计中,你想要的基类class A到目前只有一个接口,用于其派生类。 这意味着,你不希望任何人实际实例的基类的对象。 你只需要上溯造型到它(隐含的向上转型,它给你多态行为),所以它的接口都可以使用。 这是通过使用abstract关键字使得该抽象类来实现的。 在另一方面,你要使用的功能只有部分class A ,所以你创建class B (如孩子),以减少系统间的耦合或实现的依赖,防止重复

但是记住,当你定义一个内部类,没有内部类的代码更易于维护和可读性。 当访问外部类的私有数据成员,该JDK编译器在外部类创建包的访问成员函数用于内类来访问私有成员。 这留下一个安全漏洞。 一般来说,我们应该避免使用内部类。 使用只有当一个内部类仅在外部类和/或内部类的上下文相关可为私有,以便只有外部类可以访问它的内部类。 内部类主要用于实现像迭代器,比较器等,它们以外的类的情况下使用辅助类。 关于abstract class ,它应该是抽象的助手 ,假设你的助手应该是太复杂了写抽象的形式为他们。

在你的情况,我不记得了嵌套抽象类的广泛使用,也许在Swing世界。



Answer 2:

抽象类是用来提供一个部分执行用于继承的一类。 它允许你定义一个类的方案,而不提供完整的definiton,以便它可以在子类中指定。 它的工作原理有点像你是可以从它派生的类的实例进行了抽象类中指定的任何操作的界面。 嵌套抽象类旨在通过其他内部类(甚至是匿名的人,我认为),但不能被继承由最外层类外定义的类。

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();
}


文章来源: Why nested abstract class in java