【本章的 垃圾回收与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}