创建了子类对象,调用子类的构造方法,会先调用父类的构造方法,初始化父类中的属性。但是调用了父类的构造方法,并不会创建父类的对象。
子类构造方法在执行时,会先调用父类构造方法, 为什么? 构造方法的作用是用来为对象中的属性进行赋值操作的,因为子类拥有父类中成员,所以需要对父类中的成员也要进行初始化。
在子类构造方法中,默认是有调用的,使用的super()调用父类的无参构造, 必须在子类构造方法的第一行,先要确保父类进行初始化,默认是存在的,不写也行。
使用super表示父类,对父类中成员(成员变量,成员方法,构造方法)进行访问。如果子类的构造方法中没有显式地调用基类构造方法,则系统默认调用基类无参数的构造方法。
super关键字用途
-
使用super关键字访问父类成员
-
用super.成员变量名 , 来引用父类成员变量
-
用super.方法名(参数列表),访问父类的方法。
-
用super.构造方法(参数列表),访问父类构造方法
误区: 不要把super误认为是父类对象。在创建子类对象时, 不会创建父类对象,只会将父类中的信息加载到子类对象中存储。
this表示访问自己类中的成员,super表示访问父类中的成员,但不是父类对象。
package demo1;
public class Animal extends Object{//当一个类没有使用extends继承其他类时,这个默认继承Object类
private String name;
private int age;
public Animal(){
super();
System.out.println("Animal类中的无参构造");
}
public Animal(String name, int age) {
super();//object没有有参的构造方法,默认调用无参的构造方法
System.out.println("Animal有参构造方法");
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
package demo1;
public class Dog extends Animal{
private String type;//品种
public Dog(){
super();//调用父类无参构造方法
System.out.println("Dog类中无参构造方法");
}
public Dog(String name, int age) {
super(name, age);//调用的是父类中有参构造方法
}
public void play(){
System.out.println("狗会玩耍");
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
package demo1;
public class XiaoTianQuan extends Dog{
private String color;//颜色
public XiaoTianQuan(){
super();//必须放在第一行,不写也是存在的
System.out.println("XiaoTianQuan类中的无参构造方法");
}
public XiaoTianQuan(String name, int age) {
super(name, age);//调用的是父类中有参构造方法
}
public void fly(){
System.out.println("哮天犬会飞");
}
}
package demo1;
public class Test{
public static void main(String[] args) {
XiaoTianQuan xtq = new XiaoTianQuan();//依次调用Animal,Dog,XiaoTianQuan的构造方法
xtq.setName("哮天");
xtq.setAge(500);
// new XiaoTianQuan("哮天", 1000);
}
}