簡體   English   中英

如何識別對象是哪種類型的繼承類? 爪哇

[英]How to identify which type of inherited class the object is? JAVA

假設我有一個包含 5 個類的 Java 代碼:

class a = superclass.
class b = class that inherits a methods and have others.'''
class c = class that inherits a methods and have others.'''
class d = class that have an array (lets call "arrayA") of class a objects and other methods(like addObjectToArray).
class e = main.

我的疑問是:

  1. 有沒有辦法將 B 或 C 對象添加到 arrayA 維護這個類(B 或 C)的所有不同變量和方法?
  2. 如果我想在主代碼中向 arrayA 添加一個 B 對象(調用 addObjectToArray),然后在主代碼的某些部分標識該對象是哪個類(如果是 a、b 或 c),甚至在d 類識別它(假設我初始化並且一切正常。我現在只是在操作數組)我該怎么做?
  3. 有沒有辦法調用只存在於arrayA 上的b 類或c 類中的方法? 如何?

如果我不夠清楚,我稍后會發布代碼。 但是我也要求一些參考來研究對象數組和繼承一起操作。

這是很多教程中涵蓋的所有非常基本的東西,但我會嘗試編譯一個簡短的答案。

首先,讓我們把結構弄好。 你有這樣的事情,不是嗎?

class A {
}

class B extends A { 
  void someBMethod();
}

class C extends A{
}

class D {
  A[] arrayA;
}

所以:

有沒有辦法將 B 或 C 對象添加到 arrayA 維護這個類(B 或 C)的所有不同變量和方法?

您基本上是在問是否可以將 B 或 C 的實例分配給D.arrayA 如果是這樣,是的,這是可能的,因為兩者都擴展了 A 並因此具有“is-a A”屬性。 它們仍然分別是 B 或 C 實例(就像個別汽車仍然相同,即使它們位於只允許汽車的停車場)。

如果我想在主代碼中向 arrayA 添加一個 B 對象(調用 addObjectToArray),然后在主代碼的某些部分標識該對象是哪個類(如果是 a、b 或 c),甚至在d 類識別它(假設我初始化並且一切正常。我現在只是在操作數組)我該怎么做?

你問的是如何知道數組元素的類型,對嗎? 為此使用instanceof ,例如:

for(A element : arrayA) {
   if( element instanceof B ) {
     //it's a B
   } else if( element instanceof C ) {
     //it's a C
   }
}

有沒有辦法調用只存在於arrayA 上的b 類或c 類中的方法? 如何?

是的,您需要進行轉換,例如在if( element instanceof B)您將執行以下操作:

B casted = (B)element;
casted.someBMethod();

一些注意事項

使用instanceof和強制轉換通常不是解決問題的最佳方法,因為這可能很脆弱(嘗試將 C 實例強制轉換為 B 的事情)、乏味(您總是必須首先檢查類型或考慮添加E extends A ) 等。

因此,您最終可能會查找幾個原則:

  • 偏向於組合而不是繼承
  • 編程接口
  • 在適當的地方使用泛型

您可以將 B 或 C 實例放在A[]數組中,它們會保持它們的原樣,但是當您從數組中檢索它們時,編譯器只知道它們是 A 類型,因此要調用 B 或 C 獨有的成員,檢索對象后,您必須將它們轉換為 B 或 C。 要安全地這樣做,您必須先進行instanceof檢查。

例如:

for (A item: arrayA) {
    if (item instanceof B) {
        B b = (B)item;
        // do something with b
    }
}

然而,通常情況是,如果您發現必須大量使用instanceof ,那么您就會遇到設計問題,並且可以通過更好地利用多態性(繼承和接口)來簡化您的代碼。 這並非普遍適用,但普遍適用。

一個常見的新手錯誤是認為強制轉換將對象從一種類型更改為另一種類型。 這是錯誤的。 它只會改變編譯器查看對象類型的方式。 如果您嘗試將對象強制轉換為尚未匹配的類型,則會在運行時收到 ClassCastException(崩潰)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM