JAVA编程思想笔记 第五章 初始化和清理

outline

  • 构造器
  • 清理/垃圾回收

5.1 构造器

5.1.1 用构造器确保初始化

  • 无参构造器/默认构造器
    如果已经定义一个构造器的情况下,编译器不会再自动创建默认构造器
class Rocket {} //Default constructor
class Rock {
  Rock() { // This is the constructor
    System.out.print("Rock ");
  }
}

5.1.2 方法重载 overloading

class Tree {
  Tree() {}
  Tree(int initialHeight) {}
}
  • 区分重载方法

    • 每一个重载的方法必须有一个独一无二的参数类型列表
    • 参数的顺序不同也可以作为区分
    • 不可以以返回值进行重载
  • 涉及基本类型的重载

    • 如果传入的数据类型小于方法中生命的形式参数类型,实际数据类型就会提升.
    • char类型会提升到int
  • this

    • 在方法的内部,用来表示调用方法的那个对象
    public class Leaf {
      int i = 0;
      Leaf increment() {
        i++;
        return this;
      }
    }
    

class Person {
public void eat(Apple apple) {
Apple peeled = apple.getPeeled();
System.out.println("Yummy");
}
}
class Peeler {
static Apple peel(Apple apple) {
// ... remove peel
return apple; // Peeled
}
}
class Apple {
Apple getPeeled() {
return Peeler.peel(this);
}
}
public class PassingThis {
public static void main(String[] args) {
new Person().eat(new Apple());
}
}

- 套娃
在构造器中调用另一个构造器

constructor() {}
constructor(int i) { this.i = i; this()}


## 5.2 清理
### finalize()方法
- 定义: 一旦垃圾回收器准备好释放对象占用的空间,一定先调用finalize(),并在下一次回收时才进行真正的回收
- 垃圾回收只与内存有关

### 垃圾回收器如何工作
- 记数法清理垃圾(理论方法,不现实)
- 停止-复制法
暂停程序,将所有存活对象复制到另一个堆,清理其余部分
- 标记-清扫法
从堆栈和静态存储区出发,遍历全部引用,找出存活对象进行标记.清理过程中将所有未标记部分清理.产生大量的不连续空间.
- 自适应技术
 - 分代
 - 大多数对象比较稳定的时候采用标记清扫
 - 出现空间碎片较多的时候进行停止复制

## 5.3 初始化
### 成员初始化
- Java要尽量保证所有变量在使用前能得到恰当的初始化
- 基本类型的变量会被编译器赋予初始值
- 指定初始化
 - 在定义类成员变量的地方进行赋值

boolean bool = true;
Depth d = new Depth();


### 构造器初始化
- 自动初始化将会发生在构造器初始化之前

public class Counter {
int i; //i = 0
Counter() { i = 7; }
}

- 初始化顺序
   - 变量的顺序决定了初始化的顺序
   - 即使变量定义位于方法之间,他们依然会在任何方法被调用之前初始化
   - 先静态后非静态

- 静态数据的初始化
   - 无论创建多少对象,静态数据共享同一块存储区域
   - 静态域会被初始化为基本类型/null(对象引用的初始化)
   - 静态初始化只会在第一次创建对象的时候初始化

- 对象的创建过程
   - 构造器是静态方法,在创建对象的时候首先初始化,Java解释器寻找类的路径/.class文件
   - 载入.class文件后有关静态初始化的所有动作都会进行
   - new Obj() 创建对象的时候会在堆上为对象分配足够的空间
   - 存储空间会被清零,这样就自动将obj内部所有成员初始化为0|null
   - 执行所有出现于字段定义处的初始化动作
   - 执行构造器

- 显式的静态初始化

public class Spoon {
static int i; static Cup cup1;
static { i = 47; cup1 = new Cup(); }
}


- 非静态实例的初始化

int i; Cup cup1;


- 数组的初始化

Integer[] a = new Integer[rand.nextInt(20)];
for(int i = 0; i < a.length; i++) { a[i] = rand.nextInt(500); }

int[] a1 = {1,2,3,4,5,};

Integer[] b = new Integer[] {1,2,3,4,}

   - a2 = a1; 数组赋值的本质是引用
   - .length 获得数组元素数目
   - 数组初始化的特殊用法

public class DynamicArray {
public static void main(String[] args) {
Other.main(new String[]{ "fiddle", "de", "dum" });
}
}
class Other {
public static void main(String[] args) {
for(String s : args){System.out.print(s + " ");}
}
}


- 可变参数列表
万物起源object,参数定为object数组

### 枚举类型 enum

public enum Spiciness {NOT, MILD, MEDIUM, HOT, FLAMING }
Spiciness howHot = Spiciness.MEDIUM;

适用于switch语句
posted @ 2020-03-14 22:17  希恩布劳戈  阅读(136)  评论(0编辑  收藏  举报