注:super():调用父类构造函数,super.属性:调用父类的属性
前提一:父类中有一定的属性(参数),子类中无新属性:
情况1:当父类和子类均无自定义构造函数(即均使用默认构造函数)时,可独立创建父和子类实体。
情况1.1:当父类和子类均有自定义无参构造函数时,可独立创建父和子类实体。
情况2:当父类和子类均有自定义构造函数,子类中自定义构造函数使用super()函数可独立创建父和子类实体。
情况3:当父类无自定义构造函数,子类使用super(),编译报错。若此时子类使用super.属性进行构造则只能创建子实体,无法带参创建父实体,但可以无参数创建父实体。
情况4:当父类有自定义构造函数,子类无自定义构造函数时。只能创建父类实体,无法创建子类实体。
情况5:当父子都有自定义构造函数时,子类使用super().还是super.属性都可独立创建父子类。
前提二:父类中有一定的属性(参数),子类有新属性:
情况1:当父类无自定义构造函数,子类有构造函数时,仅当子类使用super.属性时才能独立创建子类实体,无法使用super()。
//父类
public class person {
String name;
String sex;
}
//子类
public class OneMan extends person{
String greet;
public OneMan(String name, String sex,String greet)
{
super.name=name;
super.sex=sex;
this.greet=greet;
}
}
public class Main{
public static void main(String[] args){
OneMan A=new OneMan("小明儿","男","哈喽哈喽");
System.out.printf("%s %s %s\n",A.name,A.sex,A.greet);
}
}
情况2:当父子类都有自定义函数时,子类必须先使用super(属性,属性)调用父类构造函数。此时可独立创建父类实体和子类实体。
//父类
public class person {
String name;
String sex;
public person(String name,String sex)
{
this.name=name;
this.sex=sex;
}
}
//子类
public class OneMan extends person{
String greet;
public OneMan(String name, String sex,String greet)
{
super(name,sex);
this.greet=greet;
}
}
public class Main{
public static void main(String[] args){
OneMan A=new OneMan("小明儿","男","哈喽哈喽");
person B=new person("小刚父","男");
System.out.printf("%s %s %s\n",A.name,A.sex,A.greet);
System.out.printf("%s %s ",B.name,B.sex);
}
}
总结:子类并不能继承父类的构造函数。要想创建子类实体,子类必须要有构造函数(除非父类没有构造函数)。super()函数会调用父类具有相同参数的构造函数(因此若父类中没有构造函数,子类中有构造函数则使用super()构造会报错)。