第5章 初始化与清理

 【本章的 垃圾回收与finalize()方法部分,真的是讲的太烂了】

   ·程序员      <初始化>

    ·编译器      <默认初始化>

    ·变量{字段,局部变量}  <占用>

    ·垃圾回收器            <清理>

    ·资源{内存}

    ·安全问题 - 代价

    ·特殊方法{构造器}       <创建> 对象  

    ·垃圾回收器 <释放> 内存资源

   

5.1 用构造器确保初始化

    ·创建对象时、用户有能力操作对象前,Java自动调用相应的构造器,来确保对象初始化

    ·编译器在初始化期间调用与类名同名构造器

    ·概念上:初始化和创建彼此独立;在Java中,初始化和创建绑定在一起

    ·对于返回值为空(void),尽管方法本身不会返回什么,但仍可选择让它返回别的东西(这句怎么理解?)。构造器则不会返回任何东西。

    ·(构造器)无返回值 != (void方法)返回值为空(void)

    ·new 表达式<返回>(新建对象的)引用,构造器本身无返回值

5.2 方法重载

    ·方法重载:同名不同参(想象调用时的情景,只有用参数列表才能作为多个重载方法的区分依据)。但访问权限、返回值类型可改变。

    ·重载原因:

       1.同名方法<表达>(有细微差异的)含义

       2.构造器—需要多种方式创建对象,而其名字已由类名决定(唯一)

    ·编译器<区分>重载方法:参数列表(类型,顺序)

    ·(涉及基本类型的)重载:

       ·普通整数         :默认为int型接收

       ·实参类型 < 形参类型:实际数据类型<被提升>#就近提升

       ·char型       :无匹配?直接提升至int型:正常处理

       ·实参类型 > 形参类型:(显式)类型转换{窄化}

5.3 默认构造器的提供

    ·默认构造器:程序员创建了构造器?是:编译器创建

5.4 this关键字

    ·this:指代方法调用者(让方法直到其调用者是谁),其实就是当前对象的引用

    ·编译器<区分>(同一类型的)(不同)对象的方式:将“所操作对象的引用”<作为>参数传递给方法。

        ·用this在构造器中调用构造器:构造器里this只能在起始处调用一个构造器

5.5 清理:终结处理和垃圾回收

    ·%垃圾回收器只知道释放new分配的内存

    ·%无论对象是如何创建的,垃圾回收器都会负责释放对象占据的所有内存

    ·#一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。

    ·#如果在finalize()里加入某种擦除功能,当垃圾回收发生时(不能保证一定发生),finalize()得到了调用,图像就会被擦除。(对于匿名对象,System.gc()就能引发其finalize()方法的调用)

    ·非new方式获得对象:

       ·反射机制:

           ·java.lang.Class的newInstance()方法

           ·java.lang.reflect.Constructor的newInstance()方法

       ·反序列化

       ·clone()

       对于非new方式获得对象,在类中定义一个finalize()方法

    ·Java允许在类中定义一个名为finalize()的方法。一旦垃圾回收器准备好释放对象占用的内存,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。

    ·不该将finalize()作为通用的清理方法。

    ·对于匿名对象,如果在其被创建后又调用了System.gc()会引发其finalize()方法的调用

    ·Debug模式下,按F5(更详细)或F6键或F7+F8调试main()方法,会发现方法调用栈最终调用了Thread的exit()方法(使用Debug阅读源码是非常不错的)

    ·只要存储空间没有濒临用完的那一刻,对象占用的空间就总也得不到释放。如果JVM并未面临内存耗尽的那一刻,它是不会浪费时间去执行垃圾回收以恢复内存的。

    ·内存页面调度:显著地影响性能

    ·垃圾回收技术:

       ·引用计数:简单但速度很慢。引用计数器为0时,释放内存。对象之间循环引用,即便   对象应该被回收,但计数不为0。

       ·停止-复制:垃圾产生较多时,暂停程序运行,将非垃圾对象复制到新堆,新堆空间连续

           ·简单点说,你房间里不要的东西比较多时,那你就把需要的东西整理出来,这样打扫     效率高点。

       ·标记-清扫:垃圾产生较少甚至没有时,将垃圾对象标记出来清理掉,剩余空间不连续

           ·简单点说,你房间里不要的东西比较少时,那你就把不需要的东西标记出来,把它们     清理出去。

       ·自适应的、分代的、停止-复制、标记-清扫式垃圾回收器

    ·JIT:惰性评估

5.6 成员初始化

    ·局部变量:编译器检查

    ·成员变量:

       ·默认初始化:

           ·基本类型:false,空白,0,0.0

           ·引用类型:null

       ·指定初始化:

5.7 构造器初始化

    ·用构造器初始化字段(这些标题如“构造器初始化”起得真是乱啊)

    ·初始化在创建对象之前完成:

       ·创建对象之前的动作:

           ·加载类层次结构上的静态成员:静态字段,静态代码块;一次性的

           ·初始化字段:

           ·调用实例代码块:

           ·调用特定构造器:

5.8 数组初始化

    ·可变参数列表:TypeName...args

5.9 枚举类型

    ·实例:具名值|常量|大写字母(下划线)

    ·enum关键字:为enum生成对应的类时,产生了某些编译器行为

        ·编译器添加特性:

           ·toString()方法

           ·ordinal()方法:enum常量声明顺序

    ·在switch语句中使用:switch(enumType arg){case enumInstance}

原文地址:https://www.cnblogs.com/InformationGod/p/8514092.html