用构造器确保初始化
- 默认构造器/无参构造器,如果没有的话,编译器会自动创建
- 构造器没有返回值,是一种特殊的方法
- 先初始化成员变量,再调用构造方法
方法重载
- 允许不同参数
- 通过不同参数类型区分
- 将基本类型传递给重载方法时
- 如果传入的数据类型小于方法中声明的形式参数类型,实际数据类型就会被提升
- char会被直接提升为int型
- 如果传入实际参数较大,就通过类型转化进行窄化转换。
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