1.构造方法
1.1基本性质
构造方法必须与类名完全相同。
构造方法没有返回类型,即使是void类型也不可以。
没有构造方法,类就不能创建实例。所以,每个Java类都有至少一个构造方法。
如果我们不创建构造方法,Java会自动创建一个默认的构造方法(一个无参数的构造方法)。
一旦我们自己创建了构造方法(不论是否有参数),Java就不会帮我们创建默认的构造方法了。
PS:Java没有析构方法,因为有垃圾回收机制。
1.2调用问题
一个构造方法只能调用一个别的构造方法(可以是其直接基类的,也可以是这个类自己的)。构造方法不能调用自己本身。
在构造方法中,调用别的构造方法时,这个调用语句必须是该构造方法的第1条语句。
不管子类的构造方法调用了多少个,在它调用的所有构造方法里最后调用的一个构造方法(方法体最先被执行的构造方法)里调用其直接基类。
此时可以显式调用,也可以隐式调用,但隐式调用只会调用其直接基类的的无参数的构造方法。
调用顺序查看:
public class OverTest extends Test{
static int i;
public OverTest(){
this(5);
System.out.println("无参数的方法体被执行");
}
public OverTest(int i){
System.out.println("int型构造方法体被执行");
}
public static void main(String[] args) {
OverTest test=new OverTest();
}
}
class Test{
public Test() {
System.out.println("基类无参数的方法体被执行");
}
public Test(int i) {
System.out.println("基类int型构造方法体被执行");
}
}
输出结果是:基类无参数的方法体被执行int型构造方法体被执行
无参数的方法体被执行
构造方法的调用顺序是从前往后的,但是其方法体的执行顺序缺正好是相反的。
PS:这里可能和C++不太一样,C++中构造函数的调用顺序与其执行顺序是一样的,而且正好与Java中方法体的执行顺序相同。
这是因为C++中构造方法的调用是在成员初始化列表中进行的。成员初始化列表是先于函数本身被执行的。
2.成员变量初始化顺序
先初始化静态成员变量,后初始化非静态成员变量。
成员变量定义的顺序决定了它们初始化的顺序。
成员变量的初始化的两种方法。
①定义同时进行初始化
int i=2014;
②定义之后再初始化
int i;
{
i=2014;
}
PS:定义之后初始化必须放到代码块(嵌套块)中。成员变量可以不初始化就用,因为它们有默认值,但是成员变量中的常量没有默认值,要初始化之后才可以用。另外我们还可以在构造方法里面对所有的非静态成员变量进行初始化。
静态成员变量的初始化可以在静态代码块中也可以在非静态代码块中,但是静态成员常量的初始化只可以在静态代码块中进行初始化,非静态成员变量的初始化要放在非静态代码块中。
PS:在代码块中可以定义与成员变量相同命名的变量,而且在其中定义的变量不是成员变量,只在该代码块有效。代码块中不可以定义方法,但可以调用方法。
成员变量的初始化会在任何方法(包括构造方法)被调用之前得到初始化。
举例:
public class OverTest {
static int i;
public OverTest() {
// TODO Auto-generated constructor stub
System.out.println(i+"");
}
static {
i=2014;
}
public static void main(String[] args) {
OverTest test=new OverTest();
}
}
输出结果是:2014