我总是只将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,它是对象的一部分,还是在堆栈上并且在堆中引用了数组?
答案 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,并在构造函数之后使用它,则必须将其另存为一个字段。