lgxqf  
第五章 初始化与清理

1.重载
    基本类型的重载
    1.1    当传入的数据类型小于方法中声明的形式参数类型时,传入的数据类型被会提升成方法中的类型。
        char是个例外,如果无法找到接受char的参数,就会把char提升成int型。
    1.2 当传入的类型大于方法中声明的形式参数类型时需要执行窄化转换(强制转换)
    void f3(int); long l;  fs( (int)l)

2.this关键字
    类的成员函数的第一参数是this.
    在构造函数内部,this可用来调用已重载的构造函数。this(paralist);

3.清理 终结处理与垃圾回收
    3.1 finalize的工作原理
        (1)一旦垃圾收集器准备好释放对象占用的存储空间,它首先调用finalize(),而且只有在下一次垃圾收集过程中,
        才会真正回收对象的内存.所以如果使用finalize(),就可以在垃圾收集期间进行一些重要的清除或清扫工作.    
        (2)但是jvm不保证finalize()一定被调用,也就是说,finalize()的调用是不确定的,这也就是为什么sun不提倡使用finalize()的原因
        (3)当分配内存时使用了类似C语言的做法时,如malloc, 那么需要在finailize中调用free来释放内存。
        (4)如果希望进行除释放存储空间之外的清理工作,我们得自已写个函数,如Release(),并明确地调用它。
        
    3.2 三条原则
        对象可能不被垃圾回收
        垃圾回收并不等于"析构",即finalize()不一定被调用
        垃圾回收只与内存有关。
    
    3.3 JIT(Just in time)
        可以把程序全部了或部分翻译成本地机器码,程序运行速度因此得以提升。
        只有在必要时才编译所需的代码,从而不会被执行的代码压根就不会被编译。
        
4.成员初始化
    4.1成员初始化为0
       当new一个对象时,会在堆上为该对象分配存储空间,并将这块内存清零,
       从而保证类中的数据成员初始值为0,bool为false。引用初始化为null。
       如:char型数据成员 用System.out.print()打印时为空白,因为其值为0.
       
    4.2可以用函数初始化数据成员:
        public class MethodInit
        {
            int i = f();
            int f(){return 1;}
        }
        
    4.3初始化顺序:
        变量定义的先后决定了初始化的顺序。
        成员变量的会在构造函数调用之前得到初始化,静态对象在成员变量之前初始化
        初始化静态变量--->初始化成员变量(非静态)-->构造函数
    
    4.4静态初始化
        静态初始化只有在必要时刻才会进行(JIT)。即使类中有静态变量,但程序中并未使用到该类,那么该类的的静态变量也不会初始化。
        因为静态变量初始化在构造函数之前,所以当创建该类对象时,则会初始化类中的所有成员。
        若仅通过类名去访问静态变量或静态方法时只会初始化全部静态变量,而不会初始化成员变量。因为并没有创建新的对象。
        静态初始化只在Class对象首次加载的时候进行一次
        
    4.4块初始化
    (1)静态变量块初始化
        static int i;
        static String s;
        
        static
        {
            i =1;
            s = new String("static initlization block");
        }
    (2)非静态变量块初始化
        int i;
        String s;
        
        {
            i = 1;
            s = new String("non-static");
        }
        
5.数组
    5.1所有数组都有一个固定成员 length. 如: int []a = {1,2};  int b = a.length;
    编译器不允许指定数组的大小,因为我们创建的只是一个数组的引用,为数组创建相应的空间必须写初始化表达式。 int a[3];//Error
    基本类型数组初始化方法:
        (1)new  
            int a[] = new int[20];
            所有数组元素初始化为0
        (2){} //等价于new
            int a[] = {1,2,3}//
    5.2类的数组初始化:
    即使使用new创建数组,所创建的也仅仅是个空引用数组,只不过将空引用数组分配在堆中。必须对数组中的对象初始化后才会为数组中的对象分配空间。
    如: Integer a[] = new Integer[10]; //仅仅创建了一个包含十个引用的数组,第个数组元素的值为null
         a[0].toString();  //错误,a[0]为空引用
    初始化方法:
    (1)  new
         Integer a[] = new Integer[3]
         {
            new Integer(1),
            new Integer(2),
            3,//AutoBox 自动装箱操作
        }
    (2){} //等价于new
        Integer a[] =
        {
            new Integer(1),
            4,
        }
    其中最后一个逗号可选。
    5.3 可变参数列表
        可变参数列表做为数组接收。
        public varaArgs(String... str){
            for(String s : str)
                System.out.print(s);
        }
posted on 2009-12-14 12:08  Justin_Ma  阅读(238)  评论(0)    收藏  举报