簡體   English   中英

從 ArrayList 獲取對象<object>

[英]getting objects from ArrayList<object>

我有 3 個類:一個是抽象類,名為MyClass1 ,另外兩個擴展MyClass1 ,名為MyClass2MyClass3

我創建了一個MyClass1類型 ex 的ArrayList

ArrayList<MyClass1> myArray=new ArrayList<MyClass1>(); 

然后我在MyClass2MyClass3類中創建一些對象,並將它們添加到我之前創建的ArrayList中。 問題是如何使用我在ArrayList中添加的對象來調用方法

如建議的那樣,不要將您的類命名為 Object。

您必須轉換對象才能調用子類中聲明的方法:

abstract class FirstClass {

    public void firstMethod() {

    }
}

class SecondClass extends FirstClass {

    public void secondMethod() {

    }
}

class ThirdClass extends FirstClass {

    public void thirdMethod() {

    }
}

....

public void run() {
    ArrayList<FirstClass> list = new ArrayList<>();
    list.add(new SecondClass());
    list.add(new ThirdClass());

    for (FirstClass obj : list) {
        obj.firstMethod(); //No cast needed

        if (obj instanceof SecondClass) {
            SecondClass objOfSecond = (SecondClass) obj;
            objOfSecond();
        }

        if (obj instanceof ThirdClass) {
            ThirdClass objOfThird = (ThirdClass) obj;
            objOfThird();
        }
    }
}

選項 1:如果您的基類 ( Object1 ) 獲得了方法,您可以在每個子類 ( Object2 / Obejct3 ) 上調用它

選項 2:如果要調用未在基類中定義的子類上的方法,則需要將 Object 強制轉換為特定類才能調用該方法。

例子:

for (Object1 myObject1 : myArray){
  if (myObject1 instanceof Object2){
    Object2 myObject2 = (Object2)myObject1;
    myObject2.myMethod();
  }
}

是的,不要命名您的類Object ,因為 Java 已經將這個名稱用作“基礎/根對象”。

這個問題有點難以理解,因為在 Java 中使用 Object 作為關鍵字,在談論面向對象語言時是一個具有特定含義的詞,現在是一個特定的類,所以我將重命名我們正在談論的類即將SomeObject

當您的SomeObject對象的 ArrayList 被聲明時,它將如下所示:

List<SomeObject> myArray = new ArrayList<>();

然后添加 SomeObject 的實例:

myArray.add(new SomeObject());

然后您可以通過索引訪問對象,並直接在該對象上調用方法。 在這里,我調用了SomeObject類的someMethod方法。

int i = 0; //used as index
myArray.get(i).someMethod();

請記住,如果SomeObject具有子類(例如SomeOtherObject ),則絕對允許您將SomeOtherObject的實例添加到SomeObject ArrayList。 但是,如果您向 ArrayList 添加了多個子類,然后嘗試調用子類獨有的方法,則會遇到問題。

希望這可以幫助!

暫無
暫無

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

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