19

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

   abstract class A{

          abstract class B{

          }
   }

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

4

2 回答 2

6

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

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

就您而言,我不记得嵌套抽象类的广泛使用,也许在Swing世界上。

于 2012-11-18T06:20:30.083 回答
4

abstract classes are used to provide a partial implementation of a class for inheritance. it allows you to define the scheme of a class without providing the full definiton, so that it can be specified in a child class. it works somewhat like a Interface in that you can perform any operation specified in the abstract class upon an instance of any classes derived from it. Nested abstracted classes are designed to be inherited by other inner classes (even anonymous ones I think) but not by classes defined outside the outermost class.

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();
}
于 2012-11-18T06:27:01.770 回答