Java 从ArrayList访问特定对象字段

Java 从ArrayList访问特定对象字段,java,object,arraylist,field,Java,Object,Arraylist,Field,假设我们创建一个ArrayList类型的listOfObjects,其中包含Object类型的对象: public static ArrayList listOfObjects = new ArrayList(); 我们有一个对象构造函数,它创建一个对象,包含两个字段,名称和类型: public Object(String name, int type) { /*some code*/ } 现在我们创建两个对象s,然后将它们添加到对象列表: public static Object obj

假设我们创建一个
ArrayList
类型的
listOfObjects
,其中包含
Object
类型的对象:

 public static ArrayList listOfObjects = new ArrayList();
我们有一个
对象
构造函数,它创建一个
对象
,包含两个字段,名称和类型:

public Object(String name, int type) { /*some code*/ }
现在我们创建两个
对象
s,然后将它们添加到
对象列表

public static Object object1 = new Object("object one", 1);
public static Object object2 = new Object("object two", 2);
listOfObjects.add(object1);
listOfObjects.add(object2);
假设
object1
object2
已正确添加到
listOfObjects
,我们如何访问列表中对象的
type
字段

我试过了

listOfObjects.get(1).type;
但这似乎不起作用。有办法做到这一点吗


编辑
对象
是一个示例名称。

您需要使用
对象.getClass()
您的构造函数
公共对象(字符串名称,int类型)
应该将参数分配给公共对象变量。例如:

public class MyObject {
    public String name;
    public int type;

    public MyObject(String name, int type) {
        this.name = name;
        this.type = type;
    }
}
然后调用
listoobjects.get(1).type将起作用

编辑:将类从
Object
重命名为
MyObject

  • 定义一个名为
    Object
    的类是一个非常糟糕的主意,因为已经有一个名为
    java.lang.Object
    的类,而且它位于
    java.lang
    包中,所以所有源代码都会隐式导入它
  • 您需要将字段设置为公共-
    public int type,如果你想通过这种方式访问它,你可以发布
  • 将字段保留为公共字段也不是一个好主意,因此要将它们的getter公开:
    public int getType(){return type;}

  • 首先,使用其他名称作为类名,而不是
    对象
    。虽然你可以使用它,但它只会给讨论增添混乱。(提示:这就是使用foo和bar等元语法变量的原因)

    第二,你说“它不起作用”。以什么方式?程序编译吗?它跑吗?你有错误信息吗

    最后,请阅读Java泛型,它们现在已经16岁了。如果你是一名学生,你得到的是没有仿制药的藏品,那就教育你的教授(否则你会被敲诈)

    最后,重写这一行:


    publicstaticarraylistlistofobjects=newarraylist()

    您的对象类应该是

    public class Object {  
        private String name;
        private int type;
    
        public Object(String name, int type) {
            this.name = name;
            this.type = type;
        }
    
        public int getType(){
           return type;
        }
    }
    

    然后您可以通过
    listOfObjects.get(1.getType())访问

    首先将类的名称更改为除
    对象
    之外的其他名称,然后在此类中声明两个字段
    名称
    类型
    ,您将在其中存储在构造函数中传递的值,您的代码应如下所示:

    public class TestObject {
    
        //The best approach is to declare your fields here as private
        private String name;
        private int type;
    
        //default non parameterized constructor
        public TestObject() {
            super();
        }
    
        public TestObject(String name, int type) {
             this.name = name;
             this.type = type;
        }
    
        //getters and setters of your fields to make them accessible in public
        public String getName(){
            return this.name;
        }
        public void setName(String name){
            this.name = name;
        }
    
        public int getType(){
            return this.type;
        }
        public void setType(int type){
            this.type = type;
        }
    
      //use getType() getter to get the type field value
      listOfObjects.get(1).getType();
    
    要从列表中获取对象
    类型
    ,您的调用应如下所示:

    public class TestObject {
    
        //The best approach is to declare your fields here as private
        private String name;
        private int type;
    
        //default non parameterized constructor
        public TestObject() {
            super();
        }
    
        public TestObject(String name, int type) {
             this.name = name;
             this.type = type;
        }
    
        //getters and setters of your fields to make them accessible in public
        public String getName(){
            return this.name;
        }
        public void setName(String name){
            this.name = name;
        }
    
        public int getType(){
            return this.type;
        }
        public void setType(int type){
            this.type = type;
        }
    
      //use getType() getter to get the type field value
      listOfObjects.get(1).getType();
    

    对象
    类中是否声明了
    名称
    类型
    字段(这对它来说是个坏名称)?如果不是,则应该是。是的,我们假设名称和类型已在对象类中声明。我认为这里的问题是您缺少默认非参数化构造函数的防御,因为如果您有另一个构造函数,则应该定义它,请看我的回答。