构造方法
构造方法名([参数列表]){
[this([参数列表]);] |[super([参数列表]);
语句序列
}
其中,this是调用其他的构造方法,super是调用父类的构造方法。它们都必须放在其他语句的前面。
构造方法的名字必须和类的名字完全相同。
除了访问权修饰符之外,不能有其他任何修饰符,也就不能有返回值。
尽管没有返回值,但并不能用“void”修饰。
构造方法不能用static和final来修饰。一般也不用private修饰,这会导致无法在外部创建对象。
构造方法不能由对象显式地调用。一般通过new关键字来调用,或者用this、super来调用。
构造方法的参数列表可以为空,也可以有参数。根据参数的有无,可以将构造方法分为无参数的构造方法和带参数的构造方法。
用户定义的类可以拥有多个构造方法,但要求参数列表不同。
如果用户定义的类未提供任何构造方法时,系统会自动为其提供一个无参数的构造方法。
一、无参数构造方法的定义和使用
利用无参数构造方法为一些成员变量做初始化:
public class Test {
private int x = 0;
public Test() {
System.out.println("这是个无参的构造!!!");
x = 2;
}
public static void main(String[] args) {
Test t = new Test(); //隐式调用无参数的构造方法
System.out.println(t.x); //可以通过类方法获取该值
}
}
/*public void Test() {
System.out.println("这是个无参的构造!!!");
x = 2;
}
它的输出结果如下: x = 0
语句Test t = new Test(); 并不是调用程序员自己定义的“构造方法”,而是调用了系统提供的默认 的无参数的构造方法,这个方法其实什么事情也没做,自然也就不会更改x的值。
说明:C++程序员不会犯此类错误。因为在C++中,如果在构造方法前面加上void,编译器将报错。
注意:构造方法前的访问权限修饰符同样有4种,但通常不会是private类型。因为用它来修饰的话,无法在外部使用该构造方法。
Test t = new Test(); 创建对象在没有无参构造方法下也可以的,因为默认下还有一个构造方法。*/
二、带参数构造方法的定义和使用
public class Test {
private int x = 0;
public Test(int x1) {
System.out.println("这是个有参的构造!!!");
x = x1;
}
public static void main(String[] args) {
Test t = new Test(12);
System.out.println(t.x);
}
}
系统不会再为类提供无参数的构造方法。当此类被其他类继承时,这一问题显得越发严重,它甚至会导致根本无法写出一个子类。因此,父类中应该要有无参的构造方法!!!
三、this关键字和构造方法的调用
this([参数列表])
系统将根据参数列表来决定调用哪一个构造方法。使用this时还需注意下面几点:
1、用this调用构造方法时,该语句只能用在构造方法中。
2、this语句必须是构造方法中的第一条语句。
3、和new不同,this虽然可以调用构造方法,但它只是执行构造方法中的语句,并不会创建对象。
public class Test { private int x = 0; private int y = 0; public Test(int x1) { System.out.println("这是个有参的构造!!!"); x = x1;
}
public Test(int x1,int x2) { this(30); System.out.println("这是个有参的构造!!!"); y = 59; }
public static void main(String[] args) { Test t = new Test(12,49); System.out.println(t.x+":::"+t.y); } }