构造器的作用:确保初始化
构造器的名称和类名完全相同
构造器没有返回值
构造器可以有参数,也可以没有
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