在类的继承中,子类的构造方法中默认会有super()语句存在,相当于执行父类的相应构造方法中的语句
class Test {
public static void main(String[] args) {
Cat c = new Cat(); //---------------(1)
System.out.println("-------------------");
Cat c1 = new Cat("花花",4); //----------------(2)
}
}
class Animal {
private String color;
private int foot;
public Animal(){
System.out.println("我是父类无参数构造器");
}
public Animal(String color,int foot){
System.out.println("我是父类有参数构造器");
this.color = color;
this.foot = foot;
}
}
class Cat extends Animal{
public Cat(){
//super(); //---------------可以省略
System.out.println("我是子类无参数构造器");
}
public Cat(String color,int foot){
//super(); //---------------可以省略
//super(color,foot); //---------------(3)
System.out.println("我是子类有参数构造器");
}
}
Output:
main方法中
(1)语句执行的是子类的无参数构造方法,内部默认有super(),代表执行父类无参数构造方法,因此输出父类无参数构造方法中的语句和子类无参数构造方法中的语句;
(2)语句执行的是子类有参数构造方法,内部也是默认有super(),代表执行父类无参数构造方法,,输出语句是父类无参数构造方法中的语句和子类有参数构造方法中的语句;
若将(3)语句解除屏蔽,则子类有参构造方法中执行super(color,foot)表示执行父类有参构造方法Animal(color,foot)
修改后子类:
class Cat extends Animal{
public Cat(){
super(); //----------------可以省略
System.out.println("我是子类无参数构造器");
}
public Cat(String color,int foot){
super(color,foot); //---------------(3)
//super();
System.out.println("我是子类有参数构造器");
}
}
Output:
super()代表执行父类无参数构造方法内容,super(color,foot)代表执行父类有参数构造方法。
可以试试如果把Animal的无参构造注释掉,看看会发生甚么事?
下面为了加深理解,再看一题
对文件名为Test.java的java代码描述正确的是()
class Person {
String name = "No name";
public Person(String nm) {
name = nm;
}
}
class Employee extends Person {
String empID = "0000";
public Employee(String id) {
empID = id;
}
}
public class Test {
public static void main(String args[]) {
Employee e = new Employee("123");
System.out.println(e.empID);
}
}
-
输出:0000
-
输出:123
-
编译报错
-
输出:No name
结果是编译报错。
父类没有无参的构造函数,所以子类需要在自己的构造函数中显式调用父类的构造函数,即加上super(id);
另外super()需要在构造器的第一行