知识总结:
Animal.java:
package com.imooc.animal;
public class Animal {
private String name;
protected int month;
public Animal(){
System.out.println("我是父类的无参构造!");
}
public Animal(String name,int month){
System.out.println("我是父类的2参数构造");
}
}
Cat.java:
package com.imooc.animal;
public class Cat extends Animal{
private String name;
private int month;
public Cat(){
System.out.println("我是子类的无参构造");
}
public Cat(String name,int month){
System.out.println("我是子类的2参构造");
}
}
AnimalTest.java:
package animal_Test;
import com.imooc.animal.Cat;
public class AnimalTest {
public static void main(String[] args) {
Cat one =new Cat();
Cat two=new Cat("花花",2);
}
}
结果:
结论:
子类创建对象时,先访问父类的无参构造方法,然后返回子类的有参数/无参数构造方法!(不会去访问父类的带参数构造方法!)
因此如果在构建代码之初,如果父类已经存在带参数构造方法,但是没有人工写父类的无参构造方法,子类在创建时就会报错!
建议大家无论无参构造有没有用,都建议大家把无参数构造写上!
super用途2:
如上所诉,子类创建的时候是默认去调用父类的无参数构造,但是如果在子类构造方法中,想调用父类的带参数构造如何去做呢?
答案:在子类构造方法中用super(参数1,参数2..)方法调用父类带参构造,super调用父类的所有派生属性,方法和构造方法!
(注意,根据之前所说,子类继承父类只能继承其方法,属性,到那时无法继承其构造方法。但是super()可以使子类调用父类的构造方法!)
super必须写在第一行!
Cat.java:
package com.imooc.animal;
public class Cat extends Animal{
private String name;
private int month;
public Cat(){
System.out.println("我是子类的无参构造");
}
public Cat(String name,int month){
super("牛牛",2);//调用父类的带参构造
System.out.println("我是子类的2参构造");
}
}
拓展:
super.属性 能够调用父类中的私有属性吗?
答案;
不能调用父类的private属性,只能调用protected或者范围更大的
super总结: