4
回答
对象实例化问题
百度AI开发者大赛带你边学边开发,赢100万奖金,加群:418589053   

try块中实例化还是在外部实例化,在性能上或者效率上有什么差别,或者给一

<无标签>
举报
RanGhei
发帖于3个月前 4回/81阅

实例化写在try块中,如果写在发生异常的代码之后,就不会被执行。

实例化写在try块中,如果写在发生异常的代码之前,就会被执行。

实例化写在try块外部,无论try块内是否发生异常,都会被执行。

嗯嗯,谢谢,那么一般我们在try块外边创建对象的时候会首先User u =null;有的直接new了一个对象,这种情况下,对功能和模块来说,性能和开销方面是不是可以忽略

null 的作用:

  1. 只要声明一个类的对象 (如,Integer integer),就会在栈 stack 里创建一个引用,如果不赋值,就不会在堆  heap 里为对象分配空间。
  2. 如果初始化为引用赋以空 null 值 (如,Integer integer=null),则表示这个引用 integer 不指向任何对象。
  3. 运行过程中系统若发现使用了空值 null 引用, 则立即停止进一步的访问,同时发出异常信息。

程序运行之中,

  1. 若将某个现存对象的引用置空 null,就是向 gc (Garbage Collection,垃圾回收器) 示意:本程序今后不再使用这个对象,其占有的内存,可以交还给操作系统。
  2. 其实,垃圾回收机制 就是对JVM(Java Virtual Machine)中的内存进行标记,并确定哪些内存需要回收,根据一定的回收策略,自动地回收内存,永不停息(Nerver Stop)地保证JVM中的内存空间,防止出现内存泄露和溢出问题。

下列程序演示,一旦将某个现存对象的引用置空,垃圾收集器 gc 早晚便来将其收走。
gc (Garbage Collection,垃圾回收器) 属 DaemonThread(守护线程), 其优先级比较低,用于为系统中的其它对象和线程提供服务。守护线程独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。也就是说守护线程不依赖于终端,但是依赖于系统,与系统“同生共死”。
由于gc 线程优先级比较低,所以,用  

Thread.sleep(1000); //等gc来将b的内存还给操作系统。


来拖延驱动线程(main())的结束时间,为的是,让 System.gc() 得以在程序结束之前,收走对象b。

public class GC_demo {  

    String name;
    
    public GC_demo(String name){
    	this.name=name;
    	System.out.println( name + " 被创建。");
    }
 	protected void finalize() throws Throwable {  
   		System.out.println(name + " 所占内存正在还给操作系统。\n");  
	} 
	
    public static void main(String[] args) throws Exception{  
        GC_demo a = new GC_demo("RanGhei");  
        GC_demo b = new GC_demo("开源中国-首席营养师。");  
  
        a = null;
        System.gc();  //调用垃圾收集方法 System.gc()
        b = null;  
        Thread.sleep(1000); //等待gc来将b的内存还给操作系统。
        System.gc(); 
    }  
}  

输出:

RanGhei 被创建。
开源中国-首席营养师。 被创建。
RanGhei 所占内存正在还给操作系统。

开源中国-首席营养师。 所占内存正在还给操作系统。

 

--- 共有 2 条评论 ---
RanGhei还是知识储备不太够。。。内存没有考虑到,我就说就差那么一点就是想不起来。。。十分感谢你的解答,给你点个赞。 3个月前 回复
开源中国-首席营养师[惊呆] 3个月前 回复
顶部