调用父类的的构造方法,因为构造方法不能被继承,所以需要调用父类的,这里分为两种情况:
1、当父类中有默认的构造函数时,子类自动调用父类的构造方法;
2、当父类中有带参数的构造函数时,子类需要使用super关键字调用父类的构造函数,而且必须放在子类构造方法的第一句。
任何类都有构造方法,哪怕是你不写,也会默认有一个有无参构造方法。所以你的A里面就会有一个叫A()的构造方法。
当你new A()时,默认你有一个有无参构造方法A()的方法里的第一句,会自动加上一个super();的方法,这句就是调用父类构造方法的意思,这是java规定的规则。
你可以尝试一下,在A里写一个构造方法:
A(){
super(); //这个一定要放在第一句
System.out..XX;
}
这与你不写super()这句效果是一样的,因如果没写,java会默认在第一句加上super();
如果你是想在子类的构造函数中调用父类构造函数,则需要在子类的构造函数的函数体第一行(注释语句除外)使用:super(参数列表)的方式调用,
该参数列表与父类有参构造函数声明的参数列表一致,如果你不是在子类构造函数中调用,则无法直接调用父类构造函数,这时创建一个父类对象
(通过你想调用的有参父类构造函数创建),就间接调用了该构造函数。
2 .如果父类只有有参数的构造函数,子类是否也无条件调用父类的有参构造函数呢?
子类可以无条件调用父类的无参数构造函数,如要调用有参数构造函数的话需要显式调用,但如果子类中没有显式调用父类的构造函数时,
会调用父类编译器自动给加上的无参构造函数,你可以通过反编译看到父类中多了一个无参的构造函数。如:
class Child {
public static void main(String args[])
{
System.out.println("this is father class");
}
Child()
{
System.out.println("ok...");
}
}
public class Parent extends Child{
Parent(String a,String b){
//super();//不管加不加这句,子类都默认调用父类无参构造方法
System.out.println("this is child mudi struct method");
}
public static void main(String args[])
{
System.out.println("this is child class");
Parent p = new Parent("xx","xx");
}
}
需要注意的是,java使用的都是句柄连接new对象的形式,并自动回收垃圾,而C++则是使用对象变量的形式,其构造函数在类对象定义时自动调用,赋值时调用拷贝构造
函数,而java只是复制一份句柄,对象没有复制。
在java中,Parent p;表示未初始化变量,不能使用。