构造函数是Java面向对象设计的直接体现,构造函数又叫构造方法、构造器。那么Java中设计构造函数来干什么呢?我们在前面章节中讲过面向对象(面向对象),对象是类的具体实列,当我们用new方法创建这个类的具体实列时就会调用一次构造函数,并且可以在这个构造函数中做一些初始化工作。
构造函数必须和类名一致,并且没有返回值。构造函数是一种特殊的函数,也有重载,同一个类中可以拥有多个重载的构造函数,普通的函数不能调用构造函数,但是构造函数之间可以互相调用,构造函数调用其他构造函数时必须注意:
1、只能用this关键字调用
2、this调用语句必须在构造函数体内可执行代码的第一句,否则会编译错误
public class BClass extends AClass {
private int C;
private String D;
public BClass(){
this(0);//必须在可执行代码的第一句 否则会报错
Log.i("TAG","");
}
public BClass(int a) {
this("a","b");
}
public BClass(String a,String b){
}
public int getC() {
return C;
}
}
每一个类当我们不手动创建构造函数时,Java虚拟机都会默认给我们创建一个无参数的构造函数,只有这样我们才可以new一个对象出来。如果我们手动创建了带参数的构造函数,那么Java虚拟机就不会给我们创建默认的无参构造函数,这时如果我们想要调用无参构造函数,就必须手动创建一个无参的构造函数,否则不能调用。
构造函数不能被继承,只能调用,子类中通过super调用父类中的构造函数。
如果父类中定义了带有参数的构造函数,并且没有手动定义无参构造函数,那么子类中也必须手动创建一个构造函数(有无参数均可),并且在创建的构造函数中使用super主动调用父类定义的构造函数,使用super调用父类的构造函数时super必须在构造函数体内部可执行代码的第一行。但是如果父类中既创建了无参构造函数也创建了有参数的构造函数,那么子类有没有主动调用父类构造都没影响。
//父类
public class AClass {
private int A;
private String B;
//父类AClass创建了一个带有参数的构造函数
public AClass(String bb) {
setB(bb);
}
public int getA() {
return A;
}
public void setA(int a) {
A = a;
}
public String getB() {
return B;
}
public void setB(String b) {
B = b;
}
}
//子类
public class BClass extends AClass {
private int C;
private String D;
public int getC() {
return C;
}
public BClass() {
//子类中必须也创建一个构造函数(有无参数均可)
// 并且使用super主动调用父类中的构造函数
//而且super必须在可执行代码的第一句 否则会报编译错误
super("");
Log.i("TAG", "");
}
public void setC(int c) {
C = c;
}
public String getD() {
return D;
}
public void setD(String d) {
D = d;
}
}
构造函数前面的权限修饰符可以是public、protected、private和默认权限。如果构造函数是private权限修饰符,那么意味着这个构造函数只能在本类中调用,也就是只能在本类中创建对象,这个也是单例模式设计的核心。