为什么在java中嵌套抽象类

时间:2012-11-18 06:09:14

标签: java abstract-class

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

   abstract class A{

          abstract class B{

          }
   }

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

2 个答案:

答案 0 :(得分:5)

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

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

在您的情况下,我不记得嵌套抽象类的广泛用法,可能在Swing世界。

答案 1 :(得分:3)

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

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