【问题标题】:getting objects from ArrayList<object>从 ArrayList<object> 获取对象
【发布时间】:2016-05-03 12:23:41
【问题描述】:

我有 3 个类:一个是抽象类,名为 Object1,另外两个扩展 Object1,名为 Object2Object3

我创建了一个ArrayList,它是Object1 类型 例如:

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

然后我在 Object2Object3 类中创建一些对象,并将它们添加到我之前创建的 ArrayList 中。问题是如何使用我在ArrayList 中添加的对象来调用方法

【问题讨论】:

  • 不要命名你的类对象。
  • 你必须将它们转换成你想要的类。例如。 Object2 obj2 = (Object2) myArray.get(0);因为 ArrayList 总是返回 Object 而不是 Object2 或 Object3
  • 使用get 方法?
  • Object类默认是java中所有类的父类,所以不要使用它。
  • 添加什么@MuratK。对未来说,尽量不要将任何类命名为包中的任何类java.lang

标签: java arraylist


【解决方案1】:

选项 1:如果您的基类 (Object1) 获得了方法,则可以在每个子类 (Object2 / Obejct3) 上调用它

选项 2:如果您想在子类上调用未在基类中定义的方法,则需要将 Object 强制转换为特定类才能调用该方法。

例子:

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

是的,不要将你的类命名为 Object,因为这个名称已经被 Java 用作“基础/根对象”。

【讨论】:

    【解决方案2】:

    按照建议,不要将您的类命名为 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();
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      这个问题有点难理解,考虑到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 中添加了多个子类,然后尝试调用子类独有的方法,则会遇到问题。

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-07
        • 2021-07-31
        • 2015-04-18
        • 2011-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多