thinking in java笔记 5 初始化与清理

方法重载
      重载的原因:
           1)相同的方法名可包含不同的含义,不能要求具有细微差别的方法都具有不同的方法名。
           2)构造器名由类名决定,只能由一个构造器名,想用多种方式创建一个对象,必须实现重载。
      每个重载的方法必须有独一无二的参数类型列表。参数类型列表包括类名和方法的形参列表,不包含返回值类型。因为有时你并不关心方法的返回值,想要的只是方法调用的其他效果(为了副作用而调用),这时你可能会调用方法而忽略其返回值。如void f() {}; int f() {},当调用f()时则区分调用的是哪个方法。
      涉及基本类型的重载:
         如果传入的数据类型小于方法中声明的形参类型,实际数据类型就会提升。char型不同,如果无法找到恰好接受char参数的方法,则把char直接提升至int型。如果传入的实际参数类型较大,则必须通过类型转换来执行窄化转换,否则会报错。
构造器和this
      如果没有定义构造器,则编译器创建一个默认构造器(无参),如果自定义了构造器,编译器则不创建。
      在构造器中可调用其他的构造器,如this(); this(3)。注意:Constructor call must be the first statement in a constructor。
      构造函数可为private,如单例模式中。用于不想被直接创建对象的类中,此类也不可被extends。
清理
    1)finalize()与析构函数
      一旦gc准备好释放对象占用的存储空间,将调用finalize方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。
      在C++中,对象一定会被销毁,而java中的对象却不一定会被垃圾回收。
      因此,在java中,在你不再需要某个对象之前,如果必须执行某些动作,必须自己创建清理方法。
    2)finalize用途
      无论对象如何创建,gc都负责释放对象占据的所有内存。
      在java中调用非java代码时,使用finalize来释放存储空间(c,c++ free()方法来释放)。
      finalize可用于验证终结条件,清理对象时来验证是否有未适当清理的部分。、
    3)gc
      其他语言中,在堆上分配对象的代价很高,java中不是,gc有助于提高对象的创建速度,达到其他语言在堆栈上分配空间的速度。
  • 初始化
    初始化顺序:静态对象 成员变量,构造函数
    成员变量有默认初始化值,局部变量没有。
    
对象的创建过程
1)java解释器查找类路径,定位 Dog.class文件
2)载入Dog.class,执行静态初始化的所有动作(首次加载的时候创建)
3)new Dog()创建对象的时候,首先在堆上未Dog对象分配足够的存储空间。
4)这块存储空间被清零,这就自动地将Dog对象中的所有基本类型数据都设置成了默认值
5)执行所有出现于字段定义处的初始化动作
6)执行构造器
静态子句:java中允许将多个静态初始化动作组织成一个静态子句。如:
也有非静态实例初始化:
public class Spoon{
    static int i;
    static {    //静态子句
      i=8;
     }
    int j;
    {    //非静态实例初始化
      j=6;
    }
}
     这种语法对于支持匿名内部类是必须的。
数组初始化
      编译器不允许指定数组的大小。数组定义的是一个引用。
      若在编写程序时,不能确定数组内元素个数,可以用new在数组内创建元素。
      int[] a;    a=new int[new Random(40).nextInt(20)];
      数组的创建是在运行时刻进行的,数组中的基本类型数据类型值会自动初始化为空值。
      如果忘记创建对象,并试图使用数组中的空引用,会在运行时产生异常。可以用花括号括起来的列表来初始化对象数组,Integer[] b={new Integer(1),new Integer(3),4}.初始化列表的最后一个逗号是可选的(使长列表更易于维护)。
      可变参数列表:
         不用再显式编写数组语法,指定参数时,编译器会自动填充数组。
         void printArray(Object... args){
           for(Object obj:args)
              //do  something
               }
         printArray(new Integer(46),new Float(4.2));
枚举类型
      常见enum时,编译器会自动添加一些有用的特性,如toString();ordinal();
      enum是类,在生成时添加了一些编译器行为。enum与switch搭配使用最为合适。
      另外经常使用enum来配置常量字符串。
public static enum Relationship {
GoodFriend(" 亲密好友 "), CommonFriend(" 普通朋友 "), BLACK(" 不受欢迎 ");
private String v;

Relationship(String value) {
v = value;
}

@Override
public String toString() {
return v;
}
}


posted @ 2011-10-09 17:15  因是因非  阅读(264)  评论(0编辑  收藏  举报