【问题标题】:Accessing attributes, methods of different class objects stored inside an object type Arraylist访问存储在对象类型 Arraylist 中的不同类对象的属性、方法
【发布时间】:2020-11-17 15:39:00
【问题描述】:

我有不同的武器类别,具有不同的属性和功能(其中一些是相似的)。我正在尝试遍历类的对象并尝试根据某些条件访问这些属性。以下是我创建并存储在 Object 类型的 ArrayList 中的一些对象。

Ak117 ak117 = new Ak117(); 
Ak47 ak47 = new Ak47(); 
Bk57 bk57 = new Bk57();
ArrayList <Object> weaponObjects = new ArrayList<>(Arrays.asList(ak117, ak47, bk57);
int damage = weaponObjects.get(0).damageStats; 
//damage stats is an integer inside AK117 class that returns its damage

当我这样做时,Eclipse 无法识别 .damageStats;并引发错误。 有什么方法可以访问这些对象的所有属性或方法?

【问题讨论】:

  • 抱歉,我们需要查看您的课程以提供帮助。也许接口或抽象类会以这种方式工作
  • 感谢回复,我的课很多,有什么方法可以私下联系获得帮助吗,我不能把所有的课详情都贴在这里。
  • 我给了答案@NirmalyaBasu

标签: java class object arraylist methods


【解决方案1】:

您可以使用接口或抽象类

示例

  1. 创建一个包含类所有常用方法的接口:
public interface Weapon{
    int getDamageStats();
    void shoot();
    
    // more method
}
  1. 创建类实现此接口
class Ak47 implements Weapon{

    @Override
    public int getDamageStats() {
        return 100;
    }

    @Override
    public void shoot() {
        System.out.println("Ak shoot");
    }
}

class Bk47 implements Weapon{

    @Override
    public int getDamageStats() {
        return 500;
    }

    @Override
    public void shoot() {
        System.out.println("Bk shoot");
    }
}
  1. 武器调用列表:
Ak47 = new Ak47();
Bk47 = new Bk47();
ArrayList <Weapon> weaponsList = Arrays.asList(ak47, bk47);
int damage = weaponsList .get(0).getDamageStats();

【讨论】:

  • 虽然我接受了另一个答案,因为他是第一个,但是这些细节对初学者程序员有很大帮助!为答案点赞! :)
【解决方案2】:

是的,这是 Object 类的一个偶然问题。如果您将 ArrayList 作为对象启动,正如有人已经说过的那样,您将只能访问对象类的方法。通过您发送的内容,我们可以认为您的其他类共享 communs 属性。所以最好的想法是通过一个超类,它将被其他所有类扩展并有一个吸气剂(在这种情况下,一个 getDamageStats())。然后,您将 ArrayList 作为 SuperClass 而不是 Object 启动,您将能够达到您想要的目标

【讨论】:

    【解决方案3】:

    我认为您应该重新考虑添加继承,我不是枪支专家,但也许是国家 idk。另一种选择是使用抽象类,只需抛出常用方法并修改其他方法。然后就像 Rob Evans 所说的遍历列表,但我的建议是使用 new ArrayList(new Ak47(), ...etc) 而不是 Arrays.asList。

    【讨论】:

      【解决方案4】:

      你需要类似下面的东西:

      ArrayList <Weapon> weaponsList = Arrays.asList(ak117, ak47, bk47);
      

      如果您只存储Objects,您只能为每个数组列表条目调用Object 的方法。如果您使用 Wea​​pon(定义getDamageStats() 的所有武器的接口),那么所有子类都可以调用此方法。

      【讨论】:

        【解决方案5】:

        您需要在每个武器类中编写一个 getter。

        public class Ak47 {
            int damageStats;
            
            public int getDamageStats() {
                return damageStats;
            }
        }
        

        您可以通过创建 Ak47 的实例并在其上调用 getDamgeStats 来访问另一个类中的damageStats。

        public class Example {
            Ak47 ak47 = new Ak47();
            
            int example = ak47.getDamageStats();
        }
        

        【讨论】:

        • 感谢您的回答,但这并不能解决我的问题,因为我可以直接访问 ak117.damageStats,但不能将其作为项目存储在 ArrayList 中。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-20
        • 1970-01-01
        • 2015-01-05
        • 2015-08-23
        • 2021-10-17
        • 2016-01-16
        • 2013-08-14
        相关资源
        最近更新 更多