在类构造函数中实例化ArrayList

时间:2013-11-07 19:28:02

标签: java arraylist

我有一个课程如下:

package com.aci.golfgames;

import java.util.ArrayList;

public class Course {
    private String name;
    private int noOfTees;
    private ArrayList<Tee> tees;

    public Course(){
        // Build a course with some tees.
        name = "ABC Country Club";
        ArrayList<Tee> tees = new ArrayList<Tee>();
        tees.add(new Tee("White", 126, 70.4));
        tees.add(new Tee("Red", 128, 75.2));
        tees.add(new Tee("Blue", 126, 71.4));
        noOfTees = 3;
    }

    public String getCourseName(){
        return this.name;
    }
    public ArrayList<Tee> getTees(){
        return tees;
    }
    public int getNoOfTees(){
        return this.noOfTees;
    }
}

当我尝试实例化ArrayList字段 tees 时,我似乎创建了一个不同于Object Course 中声明为字段的ArrayList。 IOW, this.tees tees 不同。如果我删除该行:

            ArrayList<Tee> tees = new ArrayList<Tee>();

我在运行时在 tees.add(...)处得到Null指针异常,我假设因为ArrayList尚未实例化。

这里有什么问题?如何实例化ArrayList?注意: tees ArrayList中的条目数将从一个对象更改为另一个对象,因此ArrayList而不仅仅是一个数组。这里的代码只是定义一个课程进行测试。

感谢。

2 个答案:

答案 0 :(得分:5)

public Course(){
    ArrayList<Tee> tees = new ArrayList<Tee>();
}

应该是

public Course(){
    tees = new ArrayList<Tee>();
}

通过在构造函数中再次将其定义为ArrayList<Tee>,您只将构造函数中tees的范围缩小为构造函数,而其他方法使用的是tees定义为实例范围内的字段。

所以是的,它实际上会创建一个将在构造函数中使用的新列表。

答案 1 :(得分:1)

是;您正在构造函数内部创建一个本地作用域ArrayList,该外观tee正在遮蔽外部tees = new ArrayList<Tee>(); 。你需要这样做:

ArrayList<Tee>

即,摆脱前面的List<Tee>

另请考虑使用ArrayList<Tee>接口而不是tee作为ArrayList的类型;这将使您以后更容易交换实现,因为您没有与{{1}}紧密耦合。