构造器
与C++类似,构造器明后才能与类名相同。
但注意区分,在JAVA中,若只定义了一个带参的构造器,需要显示定义另外一个无参构造器,才能满足无参构造器调用。
重载
- 每个被重载的方法必须有UNIQUE的参数列表
- 难以通过返回值进行函数重载,因为有时候需要利用函数副作用仅进行操作而不返回值,导致难区分
this应用场合
- 用在return语句中返回当前对象的引用。
class Leaf{
Leaf increment(){
i++;
return this;
}
void main(){
Leaf x = new Leaf();
x.increment().increment();
}
初始化i=0,进行Main()后,i=2
- 在构造器中调用构造器
class Flower(){
Flower(){
this(1);
...
}
Flower(int x){
...
}
}
在Flower()里面通过this调用Flower(int x)
static
- 静态变量,作为类间共享全局变量
- Static Blocks(静态代码块):
加载类之前执行
class Human{
int x;
static{
x = 2;
}
Human(){System.out.println(x);}
}
result: 2
垃圾回收器
- 对象可能不被垃圾回收
- 垃圾回收不等于析构
- 垃圾回收只与内存有关
Stop and Copy
暂停程序的运行,将所有存活的对象从当前堆赋值到另外一个堆中,没有复制的就需要被垃圾回收,同时回收碎片空间。
mark and sweep
从栈和静止存储区出发,遍历所有的引用,找出所有存活的对象。每找到一个存活对象,给对象设一个标记,当标记过程完成后,清理才开始。清理过程中,没有标记的对象将被释放。
finalize()
1.在GC准备释放对象所占用的内存空间之前,首先调用finalize方法。
2.调用时机:一般用于释放非JAVA资源(打开的文件资源、数据库连接),或是调用非JAVA方法(native方法)分配的内存
成员初始化
- 直接定义
class A{
int x = 1;
Depth d = new Depth();
}
- 调用function
- 构造器初始化
初始化顺序
优先级:
静态>非变量>function(包括构造器)
创建对象过程概括:(以Dog类为例)
1.首次创建Dog时或Dog的静态方法属性时,Java首先查找类路径,定位Dog.class
2.加载完Dog.class后,静态初始化完成。
3.new dog()
创建对象后,清零并设默认值。
4.执行在字段定义处的初始化动作。
5.执行构造器
显示的静态初始化
// housekeeping/Spoon.java
public class Spoon {
static int i;
static {
i = 47;
}}
非静态实例初始化
public class Mugs{
Mug mug1;
{
mug1 = new Mug(1);
}
}
同样在构造器之前执行。
数组初始化
- 所拥有的只是对数组的一个引用(你已经为该引用分配了足够的存储空间),但是还没有给数组对象本身分配任何空间。
new
非基本类型的数组时,创建的是一个引用数组 ,直到创建新的对象并把对象赋值给引用,初始化才算结束。
可变参数列表
由于Java的类均是继承与Object基类,故可用Object创建数组,进行可变参数列表创建。
printArray(new Object[] {47, (float) 3.14, 11.11});
但当你指定参数时,编译器会为你填充数组。
printArray(47, (float) 3.14, 11.11);
并且对于其他类型,也可作用可变参数,在进行自动填充时会先进行匹配。
void print(int ...)
//这里的...表示n个int类型的参数