- 用构造器确保初始化
- 构造器可以确保每个对象都会得到初始化,Java毁在创建对象时自动调用构造器。
- 构造器采用与类名相同的名称,因此并不适合"每个方法首字母小写的风格"。
- 构造器默认调用的是
无参构造方法
。
- 构造器没有返回值,与返回值为空(
void
)不同。
- 方法重载
- 方法名相同,形式参数不同的方法为重载方法。
- 每个重载的方法都必须有一个独一无二的参数类型列表。
- 参数顺序的不同也可以实现重载,但会使得程序难以维护。
- 如果传入的实际参数大于重载方法声明的形式参数,就必须通过类型转换来执行窄化转换。
- 以返回值区分重载方法,在某些场合可能无法执行。比如仅执行一个方法,而不将其赋值给某个类型,则无法判断需要调用哪个返回类型的重载方法。
- 默认构造器
- 又称为无参构造器,用于创建一个默认对象。
- 如果没有定义构造方法,则编译器会自动创建默认构造器。
- 但是如果定义了一个构造器(无论是否有参数),编译器将不会自动创建默认构造器。
- this关键字
- this关键字只能在方法内部使用,表示对调用该方法的对象的引用。
- 如果在方法内部调用同一个类的方法,则this可以省略。
- this关键字还可以将当前对象传递给其他方法。
this()
可以实现在构造器中调用构造器,但是必须置于最起始处。
static
的方法就是没有this的方法。
- 终结处理和垃圾回收
- Java的垃圾回收机制值能回收通过new创建的对象。
- Java在垃圾回收之前会调用finalize()方法,因此可以在此方法中做一些清理工作。
- 只要程序没有濒临存储空间用完的那一刻,对象占用的空间就总得不到释放。
- 垃圾回收只与内存有关
- 使用垃圾回收器的唯一原因是为了回收程序不再使用的内存。
- 垃圾回收器会自动释放由new创建的对象所分配的所有内存空间
- 如果在JAVA中使用了"本地方法"(Java中调用非Java代码),非Java代码所申请的内存空间无法被回收器直接回收,因此需要将释放方法放在
finalize()
方法中。
- Java中不允许创建局部对象,也不存在
delete
用于释放对象。
- 重点:java9.0.1中已经弃用了finalize()方法!
- 垃圾回收器如何工作
- 主要思想:对任何"活"的对象,一定能最终追溯到其存活在堆栈或静态存储区之中的引用。因此从堆栈和静态存储区开始,遍历所有引用,就能找到活的对象。
停止-复制方式
:从堆栈和静态存储区开始,遍历所有引用,找到活的对象。暂停程序的运行,将所有存活的对象从当前堆复制到另一个堆,没有被复制的全部都是垃圾。回收完成后,新堆保持紧凑排列,因此会使得之后的分配工作变得简单。
标记-清扫方式
:从堆栈和静态存储区开始,遍历所有引用,找到活的对象。将活的对象标记,然后清扫没有标记的对象。适合于只产生少量垃圾的情况。
- 该部分未理解,后期再读
- 成员初始化
- 方法的局部变量,如果没有显式初始化,则编译器会报错。
- 类的成员变量,会自动赋予默认初始值。
- 类里定义一个对象引用时,如果不初始化,该引用会获得一个特殊值null。
- 构造器初始化
- 在执行构造器初始化之前,首先会将类中散落的所有变量进行默认初始化。
- 无论创建多少个对象,静态数据都只占一份存储区域。static不能用于局部变量。
- 静态对象,只有在必要时刻才会进行初始化,并且只会初始化一次。
- 初始化的顺序:先静态对象,然后是非静态对象。
- 构造器实际上是静态方法。
- 对象的创建过程
- 首次创建某个类的对象,或调用某个类的静态方法/成员时,Java会寻找.class文件,将其加载到方法区内存,此时会初始化静态对象。
- 当用new创建对象的时候,首先将在堆中为其分配足够的空间,然后将空间清零。
- 然后执行所有成员变量的初始化操作。
- 最后执行构造器。
- 数组初始化
- 定义时初始化
- 用花括号将元素括起来。
- 用
new int[size]
也可以初始化。
- 每一个数组都有一个固有成员
length
,如果访问过界,会出现运行时错误。
- 对于引用数组,如果试图使用数组中的空引用,就会在运行时产生异常。
- 通过创建
Object[]
数组,可以应用于数组元素类型未确定的场合。
- 通过
类型...变量名
可以实现可变参数列表。
- 最好只在重载方法的某一个方法上使用可变参数列表。
- 枚举类型
enum
枚举类型的实例是常量,一般全部用大写表示。