第五章 初始化与清理

    科技2022-08-24  115

    文章目录

    1.用构造器确保初始化2.方法重载3.默认构造器(无参构造器)4.this关键字static含义 5.清理垃圾回收机器如何工作(5) 垃圾回收机制i.引用计数ii.停止—复制iii.标记—清扫iv.自适应v.”即时“编译vi.惰性评估 6.成员初始化7.构造器初始化静态数据初始化 8.初始化数组可变参数列表 9.枚举类型(enum)

    1.用构造器确保初始化
    构造器与类同名在操作对象前,已为对象分配内存空间,并调用相应构造器对象已被初始化了
    2.方法重载
    构造器/方法名相同,形式参数不同(参数列表不同)包括参数顺序不同
    3.默认构造器(无参构造器)
    如果你写的一个类中没有构造器,则编译器会自动帮你船舰一个默认构造器如果你已经定义了一个构造器(无论有参还是无参),编译器就不会自动创建无参构造器了
    4.this关键字

    this关键字表示:“调用方法的那个对象”的引用

    通常写this的时候,都是指“这个对象”或“当前对象”而且它本身表示对当前对象的引用

    static含义

    (1).在没有创建任何对象的前提下,仅通过类本身,就可以调用static方法 (2).static方法就是没有this的方法

    5.清理
    对象可能不被垃圾回收垃圾回收并不等于“析构”垃圾回收只与内存有关finialize()用途 使用垃圾回收的唯一原因是为了回收程序不再使用的内存
    垃圾回收机器如何工作

    (1) 垃圾回收机器可以提高对象创建速度

    (2) JVM中,它像一个传送带,每分配一个新对象,垃圾回收机器就往前移一格

    (3) 一面回收空间,一面使堆中的对象排列更加紧凑

    (4) 实现了一种高速的,有无限空间可以无限分配的堆模型

    (5) 垃圾回收机制
    i.引用计数
    1.简单速度慢(不被JVM应用) 2.每个对象都有一个计数器,当有引用连接至对象时,引用计数加1,当引用离开作用域时被置null,引用计数减1
    ii.停止—复制
    1.先暂停程序运行,将存活的对象从当前堆复制到新堆中,没复制的就是垃圾。在新堆中,对象是紧凑排列的。 2.缺陷: a.效率低:需要两个堆,维护需要比实际多一倍空间 b.复制问题:程序稳定运行后,垃圾很少,仍将内存从一处复制到另一处的浪费
    iii.标记—清扫
    1. 当没有垃圾的时候用此模式 2. 遍历所有引用,每找到一个存活对象就标记,待标记工作完成,开始清理未标记对象
    iv.自适应
    1.JVM中,内存分配以比较大的“块”为单位,垃圾回收器,在回收的时候往废弃“块”里拷贝对象。如果“块”在某处被引用“代数”增加;垃圾回收器会整理上次回收动作后的块。 2.大型对象不会被复制,小型对象会被复制并整理。 3.JVM监视所有对象稳定,垃圾回收效率低的话,自动切换至“标记—清扫“方式。 4.若堆空间出现很多碎片,自动切换至”停止—复制“方式
    v.”即时“编译
    1.将程序翻译成本地机器码,提高速度 2.当需要装载某个类时,编译器会找到其class文件,然后将类的字节码加入到内存中 3.即时编译器,会编译所有代码。缺陷: a.这种加载动作散落在整个程序生命周期内,累加起来更费时间 b.会增加代码长度,导致页面调度,降低程序速度
    vi.惰性评估

    ​ 即时编译器只在必要时,才会编译代码

    6.成员初始化
    局部变量,强制程序员提供初始化类的成员变量(即字段)是基本类型,编译器会给一个默认值
    7.构造器初始化
    静态数据初始化
    无论创建多少个对象,静态数据都只占用一份存储空间static关键字不能应用于局部,因此它只能作用于域如果一个域时静态基本类型域,且没有对他进行初始化,那么它就会获得基本类型的标准初值如果它是一个对象引用,那么它的默认初始化值就是null初始化顺序:先”静态“对象;后”非静态“对象静态初始化只在class对象首次加载的时候进行一次
    8.初始化数组
    可变参数列表
    不确定参数的个数时,可以使用可变的参数列表语法:参数类型 …(三个点) 例如:void printArray (Object …)作用:有了可变参数,就再也不用显示的编写数组语法了。当你指定参数时,编译器实际上会为你去填充数组可变参数列表与自动包装机制可以和谐共处
    9.枚举类型(enum)

    例:

    public enum Spiciness { NOT, MILD, MEDIUM, HOT, FLAMING }

    这里创建了名为Spiciness的枚举类型,由于枚举类型的实例都是常量,因此用大写字母表示(多个文字下划线分割)

    创建enum时,编译器会:

    (1)创建 toString() 方法:方便显示enum实例名 (2)创建 ordinal() 方法:表示enum的声明顺序 (3)创建 static valuse() 方法:按照enum常量的声明顺序,产生由这些常量值构成的数组

    enum可以在switch语句中使用,

    public class Burrito { Spiciness degree; public Burrito(Spiciness degree) { this.degree = degree;} public void describe() { System.out.print("This burrito is "); switch(degree) { case NOT: System.out.println("not spicy at all."); break; case MILD: case MEDIUM: System.out.println("a little hot."); break; case HOT: case FLAMING: default: System.out.println("maybe too hot."); } } public static void main(String[] args) { Burrito plain = new Burrito(Spiciness.NOT), greenChile = new Burrito(Spiciness.MEDIUM), jalapeno = new Burrito(Spiciness.HOT); plain.describe(); greenChile.describe(); jalapeno.describe(); } }
    Processed: 0.018, SQL: 9