个人对Java构造方法调用的总结
时间:2010-08-17 来源:zhangxindeshui
1.构造方法必须与定义它的类有完全相同的名字。构造方法没有返回类型,也没有void。
2.类可以不声明构造方法,这时类中隐含声明了一个方法体为空的无参构造方法。但当类有明确声明构造方法时,它就不会自动生成。
3.构造方法的调用:子类首先要调用父类的构造方法才能继承父类的属性和方法。如果子类的构造方法中没有显式地调用父类的构造方法,则系统默认调用父类无参数的构造方法。说说3种情况:
①父类和子类都没有显式定义构造方法或者只定义了无参构造方法,这种情况下没有问题,Java 会顺着继承结构往上一直找到 Object,然后从 Object 开始往下依次执行构造函数。以下两个例子效果一样,只是Example2有相关输出:
Example1
public class test1 {
public static void main(String[] args){
A example =new A();
}
}
class A extends B{
}
class B{
}
Example2:
public class test {
public static void main(String[] args){
A example =new A();
}
}
class A extends B{
public A(){
System.out.println("A's constructor is invoked.");
}
}
class B{
public B(){
System.out.println("B's constructor is invoked.");
}
}
输出:B's constructor is invoked
A's constructor is invoked
②父类只定义有参构造方法,那么无论子类如何定义,编译都会报错,因为父类缺少了默认无参构造方法,需要显式定义。
public class test {
public static void main(String[] args){
A example =new A(3);
}
}
class A extends B{
public A(int a){
System.out.println("A's constructor is invoked."+"a="+a);
}
}
class B{
private int b=0;
//public B(){
// System.out.println("B's constructor is invoked.");
//}
public B(int b){
System.out.println("B's constructor is invoked."+"b="+b);
}
}
把注释符去掉就可以编译,输出:B's constructor is invoked.
A's constructor is invoked.a=3
③在父类只有有参构造方法而没有无参构造方法时,可以用super(参数)来调用父类构造方法,但super无参时需要父类的无参构造方法。
public class test {
public static void main(String[] args){
A example =new A(3);
}
}
class A extends B{
public A(int a){
super(a);
System.out.println("A's constructor is invoked."+"a="+a);
}
}
class B{
private int b=0;
public B(int b){
System.out.println("B's constructor is invoked"+"b="+b);
}
}
输出:B's constructor is invoked.b=3
A's constructor is invoked.a=3
此处指定用super(3)调用public B(int b),所以就有如下输出:
B's constructor is invoked.b=3
A's constructor is invoked.a=3