thingking in java 读书笔记---初始化和清除

 
函数重载:对于基本的数据类型的重载,能自动从一个较小的类型提升为一个较大的类型,但反过来的话就需要手动强制转换。
如果你的类没有构造器,编译器就会给你一个缺省的没有参数的构造器,但是如果你有自己的构造器,编译器就不会给你缺省的。跟c++中一样。
this的用法与c++中一样,在一些时候可以用来消除歧议,但是多了一种用法,就是在构造器中调用构造器,例如:
class A {
       int i;
       float j;
       A (int i){
       this ->i=i;
}
A(int i,float j){
       this (i);
       this ->j=j;
}
}
需要注意的是,this语句只能放在构造器的第一句。
finalize函数的用法:
finalize函数绝对不是析构函数,对象的回收有gc完成,finalize函数在回收内存前执行。它的功能多用于一些特殊情况,使用不是很常用,例如:java可以用本地方法调用其他语言的代码,如果在本地方法中调用了c的malloc函数,那么就需要在finalize函数里面调用本地方法c的free方法。finalize的更常见的用法是对终结条件的判断。比如一个对象代表一个打开的文件,在清除这个对象的时候,需要保证对象是被关闭的。这个可以在finalize()函数里面处理。
垃圾回收器的工作:
垃圾回收器不是采用引用计数来寻找死的对象,而是认定任何活的对象都会在静态存储区或者堆栈里面有活的引用,于是,从静态存储区和堆栈里面寻找所有对象的引用,递归寻找活对象里面的引用,就能找到所有的活的对象,找到后,回收内存的工作有两种模式,垃圾回收器是在这两种模式里面切换,一种模式是停止-复制模式,首先把所有存活的对象拷贝到令一个内存区,然后释放所有内存,这样能保证空闲内存仍然是连续的。需要在程序暂停时执行。这种模式在只要少量垃圾的时候效率太低,就会切换到另外一个模式:标记-清扫。这个模式下标记所有的活的对象,然后清除所有的死对象,时间长了会使得内存区不连续。
成员初始化:可以在类里面指定初始化,即使不指定,也会有默认的值。指定初始化发生在类的构造函数前面。变量定义的顺序决定了其初始化的顺序(构造函数前)。指定初始化可以有更显示的方式,用初始化块。例如:
static int i;
static {
       i=1;
}
对于非静态成员:
Mug a1;
Mug a2;
{
       a1=new Mug ();
       a2=new Mug();
}
       静态成员的初始化发生在必要时候,例如一个Dog的类,初始化顺序是这样的。
       当首次构建Dog对象时候,或者Dog类的静态成员被访问时,java解释器查找类路径,定位Dog.class 文件。
       然后载入Dog.class 文件,做所有静态初始化动作。
       当用new Dog 创建对象的时候,首先为Dog在堆上分配足够的空间,这个空间被清0,使得所有的成员有了默认的值,全为0。boolean为false,对象引用为null。
       然后执行出现在预定义出的初始化。
       执行构造函数。
 
       数组初始化:
       定义一个数组:
int []a;
int a[];这两种方法都定义一个数组,但都是定义了一个数组的引用。这样的定义不能指定大小。数组的空间并没有分配。只是在堆栈上有一个引用变量。
初始化:两种方法
       int []a ={1,2,3,4,5};//必须在创建数组的地方出现。
       int []a =new int [random.nextInt(20)];//可以在定义后出现。
获得数组的长度的方法。a.length. 所有数组都有这么一个固有成员。
对于非基本数据类型,数组里面存放的都是引用。数组初始化后,里面的成员全部初始化为0,对象引用为null。不同与c++。
也可用{}列表初始化数组:
public class ArrayInit {
 public static void main(String[] args) {
    Integer[] a = {
      new Integer(1),
      new Integer(2),
      new Integer(3),
    };
    Integer[] b = new Integer[] {
      new Integer(1),
      new Integer(2),
      new Integer(3),
    };
 }
} ///
两种形式,第一种比较简单,第二种有特殊的用法,可用于参数类型和个数未知的场合。
        print(new Object[] {
      new Integer(47), new VarArgs(),
      new Float(3.14), new Double(11.11)
    });
    print(new Object[] {"one", "two", "three" });
    print(new Object[] {new A(), new A(), new A()});
 
      
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值