哪里存储的值来自java中的构造函数?

时间:2016-08-25 17:58:12

标签: java object constructor

我总是只将constuctor用于一个对象的属性。 但是当我写这篇文章时我很瘦:

  public Predmet(int esp,int obaveze,int cena){
    this.cena=cena;
    this.obaveze=obaveze;
    this.esp=esp;

    List j = new ArrayList();
    j.add(8);
    this.nesto=(int) j.get(0);

}

在哪里存储这个ArrayList,它是对象的一部分,还是在堆栈上并且在堆中引用了数组?

3 个答案:

答案 0 :(得分:2)

ArrayList在堆上创建,并且仅在此处由堆栈中的局部变量j引用。在执行构造函数之后,它将有资格进行垃圾回收。

答案 1 :(得分:0)

构造函数的工作方式与方法非常相似。在运行时,您在构造函数/方法中定义的任何内容都称为局部变量。一旦执行到达构造函数/方法的末尾,它们的范围就会结束。在consturctor之后,您的列表将符合GC的条件。然而,this.nesto仍将获得价值8作为其原始类型。

答案 2 :(得分:0)

首先,请不要使用单个变量名称!这是不好的做法,使文件更难阅读。使用更具描述性的名称有助于提高代码的可读性。

List j的创建方式,它只存在于构造函数的范围内。在构造函数之后,List j不再可访问。如果您希望在构造函数之后可以访问它,请为该对象提供一个字段。例如:

public class Example {
    private int specialNumber;
    private List<Integer> numberList;
    /**
    * Constructs a new Example Object
    */
    public Example(int exampleNum){
        // specialNumber can be accessed from a Getter method (getSpecialNumber)
        this.specialNumber = exampleNum;
        this.numberList = new ArrayList<Integer>();
        this.numberList.add(exampleNum);
        // numberList is a field of this Example now
        List<Integer> disappearingList = new ArrayList<Integer>();
        disappearingList.add(exampleNum);
        // After this method finishes, disappearingList will be gone
    }
    // disappearingList is no longer accessible
    /**
    * Gets this Example's specialNumber value
    * @return int this.specialNumber
    */
    public int getSpecialNumber(){
        return this.specialNumber;
    }
    /**
    * Gets this Example's numberList
    * @return List<Integer> this.numberList
    */
    public List<Integer> getNumberList(){
        return this.numberList;
    }
}

可能有一种方法可以挂钩一些Java清理方法并将其解决,但这会有点混乱。如果您希望能够在另一个Object中创建一个Object,并在构造函数之后使用它,则必须将其另存为一个字段。