2012-11-18 13 views
16

我想知道嵌套抽象類是什麼意思?例如,爲什麼在java中嵌套抽象類

abstract class A{ 

      abstract class B{ 

      } 
    } 

是否有我們可能需要的任何用例或場景,例如設計?或者在這種模式中有用嗎?爲什麼Java允許我們這樣做?

回答

4

在設計中,您希望基類class A僅爲其派生類呈現接口。這意味着,你不希望任何人真正實例化基類的一個對象。你只想upcast它(隱式向上轉換,它給你多態的行爲),以便它的接口可以被使用。這是通過使用抽象關鍵字使該類抽象來完成的。另一方面,您只想使用class A的部分功能,因此您可以創建class B(作爲孩子)至,以減少系統之間的耦合或實現依賴關係,並防止出現重複問題

但請記住,當你定義一個內部類時,沒有內部類的代碼更易於維護和讀取。當您訪問外部類的私有數據成員時,JDK編譯器會在外部類中爲內部類創建包訪問成員函數以訪問私有成員。這留下了一個安全漏洞。一般來說,我們應該避免使用內部類。僅當內部類僅在外部類的上下文中相關時才使用內部類,並且/或者內部類可以變爲私有的,以便只有外部類可以訪問它。 內部類主要用於實現像外部類上下文中使用的迭代器,比較器等輔助類。關於abstract class,應該是抽象的幫手,假設你的幫手應該是太複雜了,爲他們寫抽象形式。

在你的情況,我不記得廣泛使用嵌套的抽象類,也許在Swing世界。

+0

你能給我一些網站或書鏈接! – sunleo

+0

@sunleo您可以嘗試在Google嵌套/內部類的用法中進行搜索,因爲它不是在Java世界中隱藏的用法。一般來說,我們應該避免使用內部類。 –

3

抽象類用於提供繼承類的部分實現。它允許您定義類的方案而不提供完整的定義,以便可以在子類中指定它。它的工作原理與Interface相似,因爲您可以對抽象類中指定的任何操作執行任何派生自其的類的實例。嵌套的抽象類被設計爲被其他內部類(即使是我認爲的匿名類)繼承,但不是由最外層類之外定義的類來繼承。

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

這不是嵌套抽象類,它是簡單的抽象類 – sunleo

+0

好點。示例已更改。主體是相同的,但是表明內部抽象類被設計爲僅從其他內部類繼承。 –

+0

但是stil沒有嵌套的抽象類 – sunleo