Java学习笔记Java学习笔记

读书笔记 | 《Think in Java》Ⅴ 初始化与清理

2018-04-09  本文已影响13人  寒食君
信仰牌咖啡

Ⅴ 初始化与清理

---4.9更新---

随着计算机革命的发展,“不安全”的编程方式已经逐渐成为编程代价高昂的主因之一。
其中主要为“初始化”和“清理”两方面。Java提供了构造器和“垃圾回收器”。构造器为在创建对象时被自动调用的方法,垃圾回收器用于自动释放不再使用的内存资源。

5.1 用构造器确保初始化
5.2 方法重载
Cleaner c=new Cleaner()
Car car=new Car()
Clothe clothe=new Clothe()

//这样写就很麻烦
//c.cleanCar(car)
//c.cleanClothe(clothe)

c.clean(car)
c.clean(clothe)
//优雅
  1. 由小变大:
    对于数字来说,若传入参数的数据类型小于方法中声明的形参数据类型,那么实际数据类型会被提升至与形参相同;对于char来说,若无法找到恰好接受char参数的方法,编译器会将char提升至int。
  2. 有大变小:
    传入参数类型比形参大,那么需要手动进行参数的窄化转换,否则编译器会报错。
void f() {}
int f() {return 1;}

int  x=f();//正确。如果此时编译器可以判断出正确语义,可以使用。
f();//错误,无法判断。
5.3 默认构造器
5.4 this关键字
public class Car{
int p=0;
String s="";
Car () {}
Car (int p){
this.p=p;
}
Car (int p,String s) {
this(p); //在这里通过this在构造器中调用构造器。其他this是基本常见用法。
this.s=s;
}
5.5 清理:终结处理和垃圾回收
5.5.1 finalize()的用处何在
  1. 对象可能不被垃圾回收
  2. 垃圾回收不等同于析构
5.5.2 你必须实施清理
5.5.3 终结条件
Class Book {
  boolean checkedOut=false;
  Book(boolean checkOut){
    checkedOut=checkOut;
}
  void  checkIn(){
    checkedOut=false;
}
  protected void finalize(){
    if(checkedOut)
      System.out.println("Error: checked out");
}
}

public static void main(String[] args){
  Book novel =new Book(true);
  novel.checkIn();
  new Book(true);
  System.gc();//gc()函数的作用只是提醒虚拟机:程序员希望进行一次垃圾回收。
}

输出:Error: checked out

在这个例子中,对象的终结条件是对象是否被checkIn,在主函数中,由于new Book(true);这本书未被checkIn。如果没有finalize()中来验证终结条件,将很难发现这种缺陷。

5.5.4 垃圾回收器如何工作
  1. 首先得有两个堆,需要比实际多一倍的空间。
  2. 程序进入稳定状态后,可能只有少量垃圾,甚至没有垃圾。复制使得很浪费。在检查到要是没有新垃圾产生,JVM会切换到“标记-清扫”模式,这种方式速度很慢,但是只产生少量垃圾时,速度就快了。

本章的5.5节,存在一些难点,我读了三遍,尽量去理解揣摩。不过毕竟初读此书,一些笔记可能会出现偏差,望斧正。

5.6 成员初始化

---4.10更新---

  1. 对于局部变量,假如数据未得到初始化,编译器将用编译时错误来贯彻这种保证。其实对于编译器来说,可以给未初始化的局部变量一个默认值,但是Java设计者没那么做。因为未初始化的局部变量往往是程序员的疏忽,赋予默认值会掩盖这种失误,甚至导致程序错误。
  2. 在类的对象中,类的基本数据成员将都获得初始值。
5.8 数组初始化
5.9 枚举类型
写在最后
扫一扫,关注公众号

小白的成长探索之路,欢迎与我交流。

上一篇 下一篇

猜你喜欢

热点阅读