我有两个classes
,我想知道创建一个新创建的object
(使用new关键字)和进行引用(has-a)之间的实际区别。哪种方法更适合节省内存或提高性能,请参考示例代码
Student s1 = new Student();
or
Student s1;
答案 0 :(得分:1)
虽然您可以像这样在自己的行上定义变量
Student s2;
由于它未经构造或初始化,因此不能像s2.setName("x")
那样使用。
您必须构造它,也可以按照自己的方式完成它,而不是像显示的那样进行组合,前提是您像上面那样声明
s2 = new Student();
我想说的是编译器会优化掉未使用的引用,但是对于这样一个简单的变量,如果它占用了任何内存,这是一个可忽略的差异
Does unused import and objects have an performance impact
而且您只有一个类定义。 public class Student
。拥有该类类型的变量称为其实例
答案 1 :(得分:1)
如果不创建对象本身,就不能创建对对象的引用。您可以将引用视为指向堆中对象的一些指针。
当你说:
Student s = new Student();
new Student()
是构造函数调用,它将在堆上创建一个新对象。并且您正在将此对象分配给引用(在这种情况下为s
)。
将引用(传递给方法)确实非常好,因为它使您可以重复使用同一对象(每次传递时都无需重新构造同一对象)
public void someMethod() {
Student s = new Student();
updateStudent(s); // here you are passing the reference
}
public void updateStudent(Student student) {
....
}
传递引用可以避免创建新对象,但是您还应该知道,s
方法中的student
和updateStudent()
都引用了内存中的同一对象, updateStudent()
中对对象的更改将反映在someMethod()
中。
如果您正在玩需要花费大量构造时间的任何物体,则通过引用可以节省大量时间和内存。 (例如,具有100000个元素的java.util.List
)。将引用传递给列表可以为堆节省100000个元素的预订空间,然后复制它们,然后将其传递给方法。