• 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;
    { i = 47; cup1 = new Cup(); }

    
    - 数组的初始化
    

    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语句
  • 相关阅读:
    年轻人如何去有效的学习(很好的鸡汤,一语惊醒梦中人)
    python基础07 函数
    python基础06 循环
    python基础05 缩进与选择
    python基础04 运算
    python基础03 序列
    python基础02 基本数据类型
    python基础01 Hello World
    CSS3(三)BFC、定位、浮动、7种垂直居中方法
    CSS3(二)Box Model、边距折叠、内联与块标签、CSSReset
  • 原文地址:https://www.cnblogs.com/fireyjy/p/12494765.html
Copyright © 2020-2023  润新知