Thinking in Java(5)——初始化与清理

用构造器确保初始化

  • 默认构造器/无参构造器,如果没有的话,编译器会自动创建
  • 构造器没有返回值,是一种特殊的方法
  • 先初始化成员变量,再调用构造方法

方法重载

  • 允许不同参数
  • 通过不同参数类型区分
  • 将基本类型传递给重载方法时
  • 如果传入的数据类型小于方法中声明的形式参数类型,实际数据类型就会被提升
  1. char会被直接提升为int型
  2. 如果传入实际参数较大,就通过类型转化进行窄化转换。

this关键字

  • 实际上,编译器将所操作对象的引用传递给了方法
  • 用于返回“调用方法的那个对象”的引用
  • 用于在构造器中调用构造器

终结处理与垃圾回收

  • 对象可能不被垃圾回收
  • 垃圾回收不等于析构
  • 垃圾回收只跟对象有关
  • Finalize()
  • 垃圾回收器只会清理由new创建后分配的内存,因此可以自己写一个finalize(),让垃圾回收器在回收这个对象时先调用finalize(),进行其他区域的清除
  • 主要发生于使用“本地方法”时,即在java中调用非java代码
  • 不要过多地使用
  • 可以用于发现错误
  • 垃圾回收的工作机制
  • 引用计数 Reference counting
    + 引用连接至对象时,count++; + 引用离开作用域或被设为null,count--
    + 遍历全部对象,发现引用为0时,释放对象
    + 缺陷:出现循环引用时,会出现应该回收,但count不为零的情况
    + 并未被应用到java虚拟机中
    + 改进:遍历static storage和stack的所有引用,找到所有存活的对象。并继续访问该对象所包含的引用,直到整个网络被全部访问完为止。
    • 停止复制(不属于后台回收模式)
      • 如果堆空间出现很多碎片,就切换到该模式
      • 暂停程序,将存活的对象复制到另一个堆,保证新堆紧凑排列
      • 修正饮用时,需要遍历
      • 效率较低,特别是垃圾很少的时候
    • 标记清扫 Mark and sweep
      • 当没有新垃圾产生,所有对象都很稳定时,java虚拟机会转换到该模式
      • 从堆栈和静态存储区出发,遍历所有引用,找出所有存活对象,对存活对象进行标记
      • 遍历结束后开始清理,没有被标记的对象被释放
      • 剩下的空间不连续
    • 内存分配以较大的“块”为单位
      • 如果对象较大,会占用单独的块
      • 每个块都会用相应的代数(generation count)记录它是否还存活,如果块在某处被引用,代数会增加
      • 垃圾回收器会对上次回收动作之后新分配的块进行整理
      • 大型对象不会被复制(代数增加),小型对象的块被复制整理
    • 虚拟机提升速度的附加技术:JIT(Just in time)编译器技术
      • 将程序部分或全部翻译成本地机器码(本是虚拟机的工作)
      • 需要装载某个类(创建第一个对象)先找到.class文件,将字节码装入内存
      • 可以全部编译(慢,增加可执行代码的长度),也可以在必要时编译。

成员初始化

  • 局部变量
  • 未初始化时报错
  • 成员变量
    • 每个基本数据成员都会有初始值(基本都是0,除了string是null)
    • 对象引用初始值为null

构造器初始化

成员变量最先得到初始化,之后才是构造方法

静态数据初始化

  • 先静态对象,然后非静态对象
  • 创建后不会再被创建
  • 显式的静态初始化
  • Static{ i=1; j=2; etc…}
  • 与其他动作一样,仅执行一次
  • 首次创建该类对象,或者访问该静态成员时都会被执行

匿名内部类初始化

在构造器之前执行

数组初始化

  • Int[] a1
  • 边界检查需要开销
  • 数组中的基本类型会自动初始化为空值(对于数字和字符,就是0,对于布尔值,是false)

可变参数列表

枚举类型

  • 创建enum时,会自动创建tostring方法,便于显示某个enum的名字
public class Test{
    public static void main(String[] args){
        Spicienss howHot = Spicienss.MEDIUM;
        System.out.println(howHot);
    }//Output: MEDIUM

}
enum Spicienss{
    NOT, MILD, MEDIUM, HOT, FLAMING
}
  • 自带ordinal()方法,输出其声明顺序
  • 含static values方法,产生其声名量构成的数组
  • 可以用于switch
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值