很高兴您能帮我解答问题,首先祝您工作顺利。
public class Person {
private String abc;
public String getAbc() {
return abc;
}
public void setAbc(String abc) {
this.abc = abc;
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
public class TEST_1 {//测试1
Person person;
public void 方法A(){
person = new Person();
}
public void 方法B(){
person = new Person();
}
}
public class TEST_2 {//测试2
public void 方法A(){
Person person = new Person();
}
public void 方法B(){
Person person = new Person();
}
}
请问测试1 与测试2的两种NEW出Person的方式性能上有没有区别,如果有的话希望您能详细说下,谢谢各位。
给我的感觉是TEST_1类中person在内存中占用同一块内存,TEST_2类中person占用两块内存空间。
表面上你在TEST_2类中A方法中设置 person.setAbc("123456");
在TEST_2类中B方法中person.getAbc();打印输出能的到值
在TEST_1类中定义的全局变量的一个person类,用法没什么不同
性能方面TEST_2中应该就是占内存多
首先应该理解new运算符,new一个对象时,是在一个堆内存中开辟一个空间,其中存储了类的属性。
TEST_1 t1 = new TEST_1();
t1.A(); //此方法会实例化一个Person类,
t1.B(); //此方法会实例化一个Person类,
//但是此时这个person是指向不同的内存空间的,但是person本身这个变量是存储在固定不变的内存空间(当你创建TEST_1对象时)
TEST_2 t2 = new TEST_2();
t2.A(); //此方法会实例化一个Person类,
t2.B();//此方法会实例化一个Person类,
//方法内的变量是属于局部变量,按照局部变量的理解在方法执行完会被释放,但是对于对象来说,其在方法执行完会被Java的GC进行处理,不一定会被立即释放,但是GC会再一定时机内释放的,而且在方法内创建的对象在方法执行完后也无法被访问。
PS:个人理解,如果有错,请大神指出 O(∩_∩)O谢谢
new的方式上,都是一样的创建了一个对象,然后这个对象存储到对内存中。
只是第一种是将创建的对象的实例赋值给了类的成员变量,而第二种则就是创建了一个对象赋值给了一个方法内的局部变量。成员变量和局部变量的作用域不同,被回收的时机也是不同的。方法内定义的局部对象变量在方法结束后会被Java的GC回收的,而成员变量对象可能不会被立即回收的。
要说性能的话,个人觉得设置成员变量的方法应该会更高,也就是test1性能会更高。原因是在用方法a、b的时候,会加载test对象。对于test1来讲,创建test对象的时候,会首先加载Person的字节码文件,然后加载a、b方法。然而test2不会主动加载person的字节码文件,每调用一次就会加载一次person的字节码文件。所以当a、b方法调用很多的时候,就会加载无输出person的字节码文件,test1则不会。相比,test1的性能就会高一点。最后建议楼主写代码要注意,不应该有中文,这样不规范,要养成良好的变成习惯。还建议楼主了解一下类和对象的加载过程,就会很清楚new关键字的作用。http://blog.csdn.net/static_coder/article/details/54631613
测试1的Person对象是成员变量,测试2的Person对象是局部变量,占内存是一样的,只不过局部变量在方法调用结束后对象生命周期就结束了,而成员变量在方法初始化后一直存在,直到被垃圾收集器回收。