Java编程思想(四)-- 初始化与清理

来源:互联网 发布:渠道管理 知乎 编辑:程序博客网 时间:2024/06/04 17:48

构造器的作用:确保初始化

构造器的名称和类名完全相同

构造器没有返回值

构造器可以有参数,也可以没有

 

Java中,初始化和创建时捆绑在一起的。

Dog dog = new Dog();

 

构造器的名字和类名相同,如果想用多种方式构造类,就需要用到方法重载。

方法重载:

区分:每一个重载的方法都有一个独一无二的参数类型列表。(参数类型列表顺序不同也行,但不建议这样做)不能以返回值区分重载方法,因为有时使用函数时不用返回值。

 

默认构造器:

未创建构造器时,编译器会创建一个默认构造器。

如果已经定义了一个构造器,编译器就不会创建默认构造器。如定义了一个有参数的构造器,再调用无参构造器时,就会出错。

 

this:指向当前对象的引用。

在构造器中调用构造器:只能用this调用一个构造器,必须将构造器放在最起始处。

static:没有this的变量和方法。

 

finalize()方法:在进行垃圾回收之前,先会调用finalize()方法。可以将一些“终结条件”放在finalize()中。例如,类销毁时,某个变量发生变化。但什么时候调用finalize()方法不受程序员控制。如果Java虚拟机未面临内存耗尽的情形,他是不会浪费时间去执行垃圾回收以恢复内存的。

 

Java虚拟机的工作方式:

Java虚拟机中,对象的实现更像是传送带,每分配一个对象,指针就向前移一格。

垃圾回收器,一边回收空间,一边是对象紧凑排列。

垃圾回收机制:

第一种:计数法。对象被引用一次,则引用数加一,没丢掉一个被引用,则引用数减一。引用数为零时,回收该对象。如果对象之间存在循环引用,可能会出现,对象应该被回收,但计数不为零的情况。所需工作量极大(一直进行)。几乎未被使用。

第二种:对于每个活对象,必能找到他的被引用,如此反复寻找每一个活对象。

第三种,自适应:

停止-复制:停下当前程序,复制所有活的对象至另外一个堆当中,并使新堆中的对象排列紧凑。(效率低下)

标记-清扫:标记所有活的对象,然后将为标记的对象回收,剩下的堆空间是不连续的。

如果所有对象都很稳定,且垃圾收集器效率降低:切换到标记-清扫模式

如果堆空间出现很多碎片:切换到停止-复制模式

成员初始化:

类中的变量会被初始化为默认值。

方法中的变量不初始化会报错。

可以在定义变量时进行初始化,也可以在构造器中进行初始化。

定义变量时的初始化会先于构造器的初始化。(无论变量的定义是否写在构造器的前面)

静态初始化:

静态初始化只有在必要时刻才会进行,如果不被访问或所在对象未被创建,就不会被初始化。

初始化顺序:静态对象-->非静态对象(无论静态对象是否写在非静态对象的前面)

显式静态初始化:

static{

...

}

只执行一次,即第一次对象创建,或第一次被访问时。

非静态实例初始化:与显式静态初始化类似,少一个修饰符static,每创建一个对象就执行一次。

 

数组初始化:

int[] a1 = {1,2,3,};//最后一个逗号可选

int[] a2; //引用为null

int[] a3 = new int[50];

int[] a4 = new int[]{1,2,3,};

Array.toString(a1); //java.util标准类库,把数组当成字符串输出。

 

可变参数列表

参数个数可变,甚至可以是零个,即不输入参数。

public void f(int i, String... str) {   //String... str就是可变参数列表

...

}

注意:重载函数时,最好只用一个可变参数列表。

 

枚举类型:

public enum Direction {

EAST, SOUTH, WEST, NORTH   //都用大写,下划线分隔

}

Direction dir = Direction.EAST;

System.out.println(dir); //输出为EAST

0 0