java中new的用法? new 出的对象或变量,的生存周期是...?在类中和方法体中有何不同?
展开全部
对象的生命周期一般来就是看他是否没有被任何一个引用所引用了,那他就是生命终结了。这个就是比如一些方法中定义的对象在走出大括号有效作用范围,或者是走出方法,或者是你把唯一的引用赋值给其他对象了,那对应的对象生命周期就到了,注意这只是说一般情况,就是这个对象的finalize方法没有让自己这个对象起死回生的的时候他就死了。
finalize这个方法是可以让这个已经要死的对象重新活过来的。就是给一个对象一次反悔的机会,但是如果你放弃了那就是真的死了。
对象的生存周期就是当这个对象没有被任何引用指向的时候,他就是孤儿了,那他就到了一个关口,如果finalize方法也不复活,那就认为他死了。关键是这个对象有没有没人认领,要是没人认领,而且自己不找个干妈干爸,那他就是真活到头了。一些匿名对象是new完就立刻死了,因为匿名对象出生的目的就是之用一次就丢掉的,所以这个匿名是java所有对象里最悲剧的一个角色,用之即弃。而最尊贵的对象就是常量对象,这个是一生只伺候一个主人,也是用情专一的对象啊,一辈子就这一个。
finalize这个方法是可以让这个已经要死的对象重新活过来的。就是给一个对象一次反悔的机会,但是如果你放弃了那就是真的死了。
对象的生存周期就是当这个对象没有被任何引用指向的时候,他就是孤儿了,那他就到了一个关口,如果finalize方法也不复活,那就认为他死了。关键是这个对象有没有没人认领,要是没人认领,而且自己不找个干妈干爸,那他就是真活到头了。一些匿名对象是new完就立刻死了,因为匿名对象出生的目的就是之用一次就丢掉的,所以这个匿名是java所有对象里最悲剧的一个角色,用之即弃。而最尊贵的对象就是常量对象,这个是一生只伺候一个主人,也是用情专一的对象啊,一辈子就这一个。
展开全部
new 一个对象 是在内存中为该对象开辟一块存储空间。存储该对象,至于其生命周期,那要看你生命的是局部变量还是成员变量(java里没有全局变量)局部变量一般是方法里或语句块里的变量,生命周期一般是该方法或语句块内部,而成员变量或者说是属性一般是该类内部!成员变量整个类包括类里的方法都可以访问或改变,而局部变量则在方法或语句块内部访问,一旦超出范围就会被垃圾回收掉!
Java 对象不具备与主类型一样的存在时间。用new 关键字创建一个Java 对象的时候,他会超出作用域的范围之外,比如
{
String s = new String("a string");
} /* 作用域的终点 */
在作用域的终点句柄s消失,但new关键字创建的对象还是存在,在没有垃圾回收机制的情况下,最后被对象充斥的内存会导致内存溢出。在java 里 垃圾回收器,它会查找用new 创建的所有对象,并辨别其中哪些不再被引用。随后,它会自动释放由那些闲置对象占据的内存,以便能由新对象使用。
初始化的区别:
若某个主数据(java的8大主类型)类型属于一个类成员(成员变量),那么即使不明确(显式)进行初始化,也可以保证它们获得一个默认值。但局部变量(方法体里面的变量并非类的一个字段)不行,如果定义一个局部变量,那么java会随机付给它一些值,而不是自动初始化为0,事实上局部变量不被初始化,编译器会报错.
Java 对象不具备与主类型一样的存在时间。用new 关键字创建一个Java 对象的时候,他会超出作用域的范围之外,比如
{
String s = new String("a string");
} /* 作用域的终点 */
在作用域的终点句柄s消失,但new关键字创建的对象还是存在,在没有垃圾回收机制的情况下,最后被对象充斥的内存会导致内存溢出。在java 里 垃圾回收器,它会查找用new 创建的所有对象,并辨别其中哪些不再被引用。随后,它会自动释放由那些闲置对象占据的内存,以便能由新对象使用。
初始化的区别:
若某个主数据(java的8大主类型)类型属于一个类成员(成员变量),那么即使不明确(显式)进行初始化,也可以保证它们获得一个默认值。但局部变量(方法体里面的变量并非类的一个字段)不行,如果定义一个局部变量,那么java会随机付给它一些值,而不是自动初始化为0,事实上局部变量不被初始化,编译器会报错.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用new创建的对象会放入堆(heap)储存空间,JVM会计算此对象的引用计数,如果引用数为0则标记为无用对象,由GC自动销毁回收内存。假设有一个People类,在一个方法中new了这个类。
public void foo{
People p=new People();
...
}
这里new了一个People对象,由变量p引用,该对象的引用计数为1。因为变量“p”是局部变量,生命周期在foo()方法内,foo()结束时p不再存在,于是p引用的People对象引用计数变为0,所以稍后也会被GC回收。
如果new出来的对象被其它方式引用,则会一直存在。
private static Set ss=new HashSet();
public void foo{
People p=new People();
ss.add(p);
...
}
这样,因为ss是静态的,加载类后会一直存在,在foo()中ss引用了new出来的People对象,那么foo结束后,People对象仍然存在,不会被销毁,可以通过ss重新访问到。
public void foo{
People p=new People();
...
}
这里new了一个People对象,由变量p引用,该对象的引用计数为1。因为变量“p”是局部变量,生命周期在foo()方法内,foo()结束时p不再存在,于是p引用的People对象引用计数变为0,所以稍后也会被GC回收。
如果new出来的对象被其它方式引用,则会一直存在。
private static Set ss=new HashSet();
public void foo{
People p=new People();
ss.add(p);
...
}
这样,因为ss是静态的,加载类后会一直存在,在foo()中ss引用了new出来的People对象,那么foo结束后,People对象仍然存在,不会被销毁,可以通过ss重新访问到。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-09-07
展开全部
new 就是创建一个类的实例,new 后面跟类的构造函数,返回的对象会赋值给左侧声明的变量,生存周期分情况,在无引用的情况下,如果这个对象静态对象,那这个对象会一直存在,直到手动赋空,如果在方法体里面那么生命周期在出方法体的时候结束,如果在类里面生命周期和这个对象的生命周期一样。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
好像是这样!new 出的变量的生命周期就在与这个变量最邻近的一对大括号{}里面!
如if中的变量,for中的变量,try catch中的变量,class中的变量,
但是,class中的变量还要看其修饰符
如if中的变量,for中的变量,try catch中的变量,class中的变量,
但是,class中的变量还要看其修饰符
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询