用构造器确保初始化
类里的数据成员,有三个途径初始化:
- 默认初始化,一般都为0。即使没有默认构造器,也会初始化
- 直接初始化,就是直接赋值
- 构造器(构造函数)初始化
重载
涉及基本类型的重载需要注意一下
- 常数被当做int
- 如果传入的数据类型小于方法中声明的形式参数,自动提升
- char略有不同,如果无法找到恰好接受char参数的方法,就会把char提升为int
注意不要通过返回值区分重载方法
默认构造器
默认构造器就是无参数构造函数,可以更改默认构造器。
如果定义了构造器,编译器就不会自动创建默认构造器
class Bird{
Bird(int i){}
Bird(double i) {}
}
new Bird();//这样就会找不到构造器
this关键字
- this关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用。但要注意在方法内部调用同一个类的另一个方法,就不比使用this,直接调用即可。
当需要返回对当前对象的引用时,常常用return this
public class leaf{
int i=0;
leaf incres(){
i++;
return this;
}}
leaf x=new leaf();
x.incres().incres().i;//i=2
- 将自身传递给外部方法时,必须使用this关键字。
- 在构造器中调用构造器可以用this,必须放在构造器的开头,一个构造器内只能有一个this。除了构造器可以调用构造器,其他任何地方都不可以调用
static的含义
- static是没有this的方法。(还不理解)
- static方法不能调用非静态方法。可以直接通过类调用(主要用途)
- 在类中置入static方法就可以访问其他static方法和static域
清理:终结处理和垃圾回收
finalize()函数后面再深入学习
成员初始化
默认初始化是类的数据成员。而方法的数据成员需要手动。
自动初始化在构造器被调用前执行。
初始化顺序
变量定义的先后顺序决定了初始化的顺序。即使变量定义散布于方法定义之间,他们仍旧会在任何地方(包括构造器)被调用之前得到初始化。
静态数据的初始化
静态初始化只有在必要时刻才会进行。只有第一次访问静态数据是被初始化,此后,静态对象不会再次被出书画。
总结对象的创建过程:
- 即使没有显示使用static关键字,构造器实际上也是静态方法。当首次创建类型为Dog的对象时,或者Dog类的静态方法/静态域首次被访问时,Java解释器必须查找类途径,以定位Dog.class.
- 然后载入Dog.class, 有关所有静态初始化的动作都会执行。因此,静态初始化只在class对象首次加载的时候进行一次
- 当用new Dog()创建对象的时候, 首先将在堆上为Dog对象分配足够的存储空间、
- 这块存储空间被清零。设置为默认值0 or null
- 执行所有出现于字段定义处的初始化动作
- 执行构造器
数组的初始化
- 数组特殊的初始化是由一对花括号完成的,等价于new
int[] a1={1,2,3,4,5};
int[] a2=a1;//两者指向同一片内存空间
a1.length;//length是数组的固有成员
- 直接用new在数组里创建元素
int[] a=new int[num];
int[] b;
b=new int[num];
- 可以用花括号括起来的列表初始化对象数组
Integer[] a= {new Integer(1), new Integer(2), 3,};
Integer[] b=new Integer[]{new Integer(1), new Integer(2), 3,};
System.out.println(Arrays.toString(a));