2015-10-29 91 views
1

有沒有在Java中使用內部類比子類更有利的情況(或反之亦然)?根據我目前的理解,內部類可以訪問外部類的字段和方法。這與使用繼承有什麼不同?內部類與Java中的子類

子類通常可以訪問標記爲public和protected的所有字段/方法。在父類中標記爲private的字段可以使用getter方法在子類中訪問。基於迄今爲止我所看到的,當方法被標記爲私有方法時,它們通常被稱爲該類別中被標記爲公共或受保護的其他方法。當然,我不是一個有經驗的Java程序員,但這似乎是大勢所趨。

根據我目前的理解,在選擇一個之間似乎沒有任何好處。有人能夠提供有關爲什麼以及何時應該使用內部類來繼承繼承(或反之亦然)的見解嗎?當你有繼承邏輯

+1

您不能通過內部類擴展第三方代碼。 – ergonaut

+2

鍵入「Java中的內部類與子類」並查看會發生什麼 – redFIVE

+0

內部類與子類無關。 – Tobi

回答

3

有內部類和子類之間差異很大:

  • 內部類是在同一文件,而子類可以在另一個文件中,也許在另一個包。
  • 如果沒有包含它的類的實例,則無法獲得內部類的實例。
  • 內部類具有他們想要的方法,而子類具有其父類的方法。子類當然可以定義其他方法,但是它們總是會有父類的方法。

有關情況:當你的大課需要一個(通常是短)類,有關其內部運作

  • 內部類中使用,當沒有人需要它。 Nik G引用的一個很好的例子是LinkedList:它需要一個Node類來工作,這很簡短,並且沒有其他類需要。因此Node是LinkedList的一個內部類。
  • 當您定義「is-a」reliationship時使用子類。想象一下:你想製作不同類型的汽車。他們有共同的屬性和特點:他們所有可以移動,他們所有有乘客等。所以你創建一個抽象類「車」與這些常見的東西。並且爲每種不同類型的汽車創建一個子類。
+0

+1,這很有幫助。但是我不確定你的第二顆子彈實際上是不同的。是不是真的,如果你有一個子類的實例,那麼你有一個父類的實例? – LarsH

+0

如果B類是A的內部類,那麼無法創建B的實例而沒有A的實例。您必須首先創建A. 它與子類有所不同:如果D是C的子類,那麼可以先創建D的一個實例,而不先創建C的一個實例。你可以做的是後面的_cast_ D到C或_assign_ D到C字段。 – ElectronWill

+0

我的意思是,如果B是A的一個子類,並且創建了一個名爲'b'的B實例,那麼'b'也是A的一個實例,但我認爲我們對事實達成了一致,只是用不同的詞。 – LarsH

1

這很簡單。但內部類和子類是不一樣的..

子類使用。例如Rectangle是Shape:所以矩形可以繼承Shape

當你有一個只需要在特定類中使用的類時,使用內部類。這樣,沒有人會使用這個類,除非他是在需要使用內部類的類中。例如: 例如: 你有類A 類a有一個地圖。 Key類是您創建的用於定義複合鍵類的類,它僅在A中使用。因此,Key可以是內部類。這種方式可以減少文件(Classes),以便其他開發人員不需要處理和理解,除非他是使用

希望有意義

+0

簡單的定義理解.. –

-1

一個子類,基本上是一個共享「是一個」與其父關係,而一個內部類股是「有」的關係。例如, 我們有一個蛋類,它是蛋類的內部類,然後我們說蛋類「有一個」蛋黃類。 蛋黃類的對象可能是作爲蛋類的成員,但有 沒有鏈接的功能。另外,比如說我們有班級的Dog擴展動物類, 所以Dog類是「動物類」,Dog類 會繼承動物的所有特徵,可能還有更多。

+3

你有意混合使用「has-a」和「is-a」嗎? – Tom

+0

@Tom你是什麼意思的混合? –

+0

重新檢查你的第一句話... – Tom

5

如果使用繼承,則可以定義兩個類之間的「is-a」關係。也就是,ChildClassParentClass

另一方面,內部類並不總是直接與外部類相關。擁有內部類的主要原因是外部類使用其特性而不讓其他類知道它。

我能想到的最好的例子是我的頭頂是LinkedList。它使用某種私人類Node來存儲每個元素的內容。當然,單個Node不是LinkedList ...但LinkedList不能工作,除非它由Nodes組成。除了LinkedList之外,沒有任何理由知道Node類存在。

+0

我認爲你的第一點是關鍵......一個內部類不需要「成爲」它的封閉類的類型。關於不瞭解內部階層的其他階級的部分往往是真實的,但有一些突出的例外。例如。 Android的RecyclerView.Adapter是RecyclerView的一個內部類(我認爲......糾正我,如果我錯了!),但它是供公衆使用的。 – LarsH

0

子類繼承它的父類的變量和方法,但內部類沒有。

因此,當孩子類應該有它的父親的成員,並且當你只需要它執行它的一部分時使用內部類的時候,你會想要使用一個子類。

例如,您將在名爲List的類中使用名爲Node的內部類,以便您可以將Node用作成員。

例如,您將在名爲Car的類中使用名爲Mercedes的子類,因爲奔馳應該繼承Car的成員並在必要時覆蓋Car的方法。