Java学习——35、子类的构造方法
本文接上篇——34、类的继承。
子类可以继承父类的除了构造方法以外的所有成员,在子类创建对象时,必须对父类的变量进行初始化。但构造方法是不被继承的,故要在子类当中调用父类的构造方法。
如果子类中没有显式调用父类的构造方法,Java默认调用父类无参数的构造方法。若父类没有不带参的构造方法,将出错。
1、 使用super()调用父类的构造方法
在子类中,可以使用“super引用”调用父类的构造方法。
其语法格式如下:
super([参数列表])
例如:在Student类中,其继承自Person类,其构造方法可声明如下:
public Student(){
super();//此处可省,调用父类无参数构造方法
number=123;
}
public Student(String name,int number){
super(name);//调用父类带参数构造方法
this.number=number;
}
2、 默认执行super()
有两种情况,Java会默认执行super。
(1) 当一个类没有声明构造方法时,Java为该类提供默认的构造方法,可默认调用父类super() 。
例:
class A{
int i;
public A(){
i=1;
}
public int getI(){
return i;
}
}
public class Add extends A{
public static void main(String args[]){
Add a=new Add();
System.out.print(a.getI());
}
}
此运行结果为:1。
本例是,Add类继承自A类,在A类中有构造方法A()不带参。在子类Add中,并没有构造方法,此时在创建Add的对象时,会自动调用super()不带参的构造方法,使i的值初始化为1,故输出为1。
(2) 如果子类的构造方法没有调用super()或this(),Java将默认执行super()。
例:
class A{
int i;
public A(){
i=1;
}
public int getI(){
return i;
}
}
//类Add,继承类A
public class Add extends A{
int j;
public Add(){
j=3;
}
public static void main(String args[]){
Add a=new Add();
System.out.print(a.getI()+""+a.j);
}
}
其运行结果为:1 3
本例中,Add继承自A类,在A类中有构造方法A(),在Add类中有构造方法Add()。但在子类Add中并没有显式调用父类的构造方法,其默认调用了父类不带参的构造方法,将i赋值为1,而在Add构造方法中将j赋值为3,故输出为1 和3。
在使用类的继承时,一定要注意是先创建父类对象再创建子类对象,因此在写子类的构造方法时,要分清它到底应该调用父类的哪一个构造方法,以免出错。
例:
class Person{
private String name;
public Person(){
this("张熹熹");
}
public Person(String name){
this.name=name;
}
publicvoid show(){
System.out.println("姓名:"+name);
}
}
public class Student extends Person{
private String number;
public Student(){
number="123";//默认调用父类的Person()
}
public Student(Stringnumber){
super();//调用父类的不带参构造方法
this.number=number;
}
public Student(Stringname,String number){
super(name);//调用父类带参的构造方法
this.number=number;
}
public void show(){//覆盖父类的方法
super.show();//调用父类的方法
System.out.println("学号:"+number);
}
public static void main(String args[]){
Student s1=new Student();
s1.show();
Student s2=new Student("645");
s2.show();
Student s=new Student("Lay","107");
s.show();
}
}
其运行结果为:
姓名:张熹熹
学号:123
姓名:张熹熹
学号:645
姓名:Lay
学号:107