`
鬼大来晚了
  • 浏览: 66239 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

Java学习笔记——初始化和清理

    博客分类:
  • Java
 
阅读更多

1.构造器
(1)默认构造器:Java同样采用构造器的方式保证对象的初始化,使用同类名相同的名称。系统会自动为每个类生成一个默认构造器,该构造器没有任何参数。创建对象时,使用:Class a=new Class();但是,如果用户自定义了构造函数(无论是否有参数),编译器都不会再帮你自动创建默认构造器了。
(2)构造器重载:用户可以定义多个方法名相同而形式参数不同的构造器,这其实应用了方法重载。
(3)this关键字标识对“调用方法的那个对象的引用”,只能在方法的内部使用。可以通过this在构造器中调用构造器,但是不能调用两个,且调用必须置于起始处。否则编译器会报错。
2、垃圾的终结和回收
(1)终结:我们都知道Java的一个好处就是为我们提供了垃圾回收机制,我们创建对象之后不用像在C++中那样一定要写一个析构函数,确保销毁该对象,在Java中我们尽管创建、使用对象就好,销毁和释放内存有垃圾回收机制自动为我们做好了。但是,由于垃圾回收器只知道释放那些由new分配的空间,如果对象获得了一块“特殊”的内存区域,它就不知道如何释放该对象的“特殊”内存。因此,java中定义了一个名为finalize()的方法:一旦垃圾回收器准备好释放对象占用的空间,将首先调用其finalize方法,并在下一次垃圾回收动作发生时,才真正回收对象占用的空间。注意,垃圾回收并不等于“析构”,JAVA里的对象也并非总是被垃圾回收。finalize()方法只用于一些特殊的情况,例如在java中调用了非java代码,在非java代码中进行了内存的分配,而没有释放内存,这种情况下就需要是用finalize方法进行一些清理工作。
但是,无论是“垃圾回收”还是“终结”,都不保证一定会发生。如果Java虚拟机(JVM)并未面临内存耗尽的情形,它是不会浪费时间去执行垃圾回收已恢复内存的。
(3)垃圾回收器的工作原理
引用计数:每个对象都含有一个引用计数器,当有引用连接至对象时,引用计数加1,当引用离开或是被置为null时,引用计数减1。垃圾回收器会在含有全部对象的列表上进行遍历,当发现某个对象的引用计数器为0时,就释放其占用的空间。这种方式简单但是速度很慢,通常用于理解java的垃圾回收机制,但是几乎从未被应用任何java虚拟机中。
停止-复制(stop-and-copy):先暂停当前运行的程序,将所有存活的(至于如何找到存活的对象,取决于不同java虚拟机的实现)对象从当前堆复制到另一个堆,没有被复制的就是垃圾。对象被复制到新的堆以后,保持紧凑排列。但是这种方法效率很低,一方面需要有两个堆,还得在这两个堆之间来回倒腾,需要很大的维护空间,另一方面在程序运行时,产生的垃圾就会很少,复制式回收器将内存从一处复制到另一处,很浪费。因此,有了第三种方式。
标记-清扫(mark-sweep):遍历所有的引用,每找到一个存活的对象,就给它做一个标记,这个过程中不会回收任何对象,直到全部的标记工作完成,清理动作才开始。
java最终采用一种自适应的垃圾回收方式:java虚拟机会进行监控,如果所有的对象都很稳定,垃圾回收器的效率低的话,就切换到"标记-清理"模式,同样,java 会跟踪”标记-清扫“的效果,要是堆空间中出现很多碎片,就会切换会”停止-复制“方式。
3、初始化
java尽力保证:所有变量在使用前都能得到恰当的初始化。类中的每个基本类型数据成员都保证会有一个初始值,对于类对象会置一个null值。对于方法的局部变量,编译器不会自动位置赋初始值,java以编译时的错误来贯彻这种保证。
对于初始化的顺序:先初始化静态对象,而后是非静态对象。并且静态对象只会被初始化一次。
4、可变参数列表
java提供了一种可变参数列表的用法:
例子:

public class NewVarArgs{
static void printArray(Object... args){
 for(Object obj:args)
    System.out.print(obj+ " ");
System.out.println();
}
public static void main(String[] args){
 printArray(new Integer(47),new Float(3.14),new Double(11.11));
 printArray("one","two");
 printArray();
}
}


但是,尽量少的时候这种可变参数列表。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics