• 推荐!搬瓦工官方代理,自动更换被封IPJust My Socks

ad

第5章 初始化与清理

  • 5.1 用构造器确保初始化
    1. 构造器是一种特殊类型的方法,它没有返回值。new表达式确实返回了对新建对象的引用,但构造器本身并没有任何返回值。
  • 5.2 方法重载
    1. 参数顺序不同也可以区分两个方法。
    2. 基本类型能从一个“较小”的类型自动提升为一个“较大”的类型。char->int, byte->short->int。
    3. 不能以返回值区分重载方法。因为直接调用方法f()会分不清。
  • 5.3 默认构造器
    1. 如果没有构造器,编译器会创建一个默认构造器。但是如果已经有了一个构造器(无论是否有参数),编译器就不会帮你创建默认构造器。(new Test()会报错)。
  • 5.4 this关键字
    1. this是“调用方法的那个对象”的引用。(调用方法时会暗自把“所操作对象的引用”作为第一个参数传递给方法。a.peel(1)->Banana.peel(a, 1);b.peel(2)->Banana.peel(b, 2))。
    2. 构造器中可以用this来调用另一个构造器。但是只能调用一个构造器,而且必须置于最起始处。除了构造器内,其他任何方法中禁止调用构造器。
    3. static方法就是没有this的方法,因此static方法中不能调用非静态方法。
Flower(){
    this("hi");
    print("non-constructor!");
}
  • 5.5 清理:终结处理和垃圾回收
    1. 垃圾回收本身也有开销,要是能不使用它,那么垃圾回收器就尽量不支付这部分开销了。因此finalize()不一定会执行,就算执行也不能确定什么时候执行。
    2. 无论对象是如何创建的,垃圾回收器会负责释放对象所占的所有内存。
    3. finalize()方法主要用在分配内存时采用了类似C语言的做法,例如在使用“本地方法”,就需要在finalize()方法中调用free()函数释放一些存储空间。
    4. 打个比方,C++的堆可以想象成一个院子,每个对象有自己的地盘,当对象被销毁后,这些地盘就必须被重用。在Java中,它更像一个传送带,每分配一个新对象,就往前移动一格。Java的“堆指针”只是简单的移动到尚未分配的区域,效率比得上C++在堆栈上分配空间的效率。
    5. Java虚拟机一面回收空间,一面使堆中的对象紧凑排列,这样“堆指针”就可以更容易的移动到更靠近传送带的开始处。
    6. 回收机制之“引用计数”:有引用连接至对象时,引用计数加1,当引用离开作用域或者置为null时,引用数减1。如果存在循环引用,就会出现问题:a->b,b->c,c->b,此时b计数2,c计数1,a释放后,b计数1,c计数1,无法释放。
    7. Java虚拟机采用自适应的垃圾回收计数。“停止->复制”->“标记->清扫”
  • 5.6 成员初始化
    1. 无法阻止类的成员变量的自动初始化的进行,它将在构造器被调用前发生。
    2. 静态数据只初始化一次,只占用一份存储区域。一样的如果是基本类型则为标准初值,如果是引用则为null。
    3. 初始化顺序是先静态对象,然后是非静态对象,最后才是构造函数。(因此无法阻止自动初始化的进行,它在构造器被调用前发生)
  • 5.8 数组初始化
    1. 数组元素中的基本数据类型会自动初始化成空值(对于数字和字符,就是0;对于布尔型,就是false)。
    2. 可变参数列表,(Object… args)。可以将0个参数传递给可变参数列表,可以传逗号分隔的String列表,也可以是一个String[]。
  • 5.9 枚举类型
    1. 编译器会创建ordinal()方法,表示某个特定的enum常量的声明顺序(从0开始,enum.ordinal())。staitc values()方法,产生由这些常量值构成的数组。
    2. 与switch一起使用。
public enum Spiciness{
    NOT, MILD, MEDIUM, HOT, FLAMING
}
点赞