public class Father {
protected String name;
int age;
Father(){
System.out.println("Father无参构造函数");
}
Father(String name){
System.out.println("person的有参数构造函数 ");
}
//public、private、protected、子类能继承的是public、protected、default(缺省的)
//java不支持多继承,C++支持,//extends:扩展,不是继承的意思
void jump(int lenth){
System.out.println("lenth = "+lenth);
}
protected void jump(int num,int a) {
// TODO Auto-generated method stub
System.out.println("num = "+num+"a = "+a);
}
static void fly(){
System.out.println("I can fly!");
}
}
public class Daughter extends Father {
Daughter(){
//super();
//在子类的构造函数当中,必须调用父类的构造函数,
//super();默认调用父类的无参构造函数
System.out.println("Daughter的无参数构造函数");
}
Daughter(String name){
super("");
System.out.println("Daughter的带参数构造函数:name = "+name);
}
public static void main(String[] a){
/*不论你使用的是自己的哪一个构造函数,只要你不指明使用父类的哪个构造函数(如果父类由多个构造函数)
父类都会在你调用自己的构造函数的同时,先调用自己的默认构造函数,如果父类由切仅有一个有参数的构造函数,那么就要小心了,
因为当你调用自己的构造函数的同时是父类会强加给你一自己的构造函数,而父类给你强加的构造函数的形式是无参数的,它不知道调用自己仅有的一个带参构造函数,
所以它还是以super()的形式给你,那么此时就相当于你自己在自己的构造函数中添加了"super()"这么一段代码,这当然是错的啦,因为父类没有这个构造函数。父类只有一个有参数的构造函数
所以你需要把正确的形式写出来"super("")",所以这个有点强买强卖的意思。如果父类由一个无参和一个有参数的构造函数,那么你就无需指明了,因为父类给你强加的这个构造函数是无参数的
*/
new Daughter();
new Daughter("Daughter");
//在静态方法中不能super
//super.jump(100);
//super();
}
}
/*
* 为什么父类会把自己的构造函数强加给子类,因为子类不能够继承父类的
* 构造函数,
* 而且,构造函数一般承载在初始化成员变量的作用,而子类如果无法使用父类的构造函数
* 那么在初始化继承来成员变量的时候就需要自己再写一遍方法。这样就会早操代码的重复,
在java中最忌讳代码重复了。所以这也是为什么有继承,java会好事做到底,再给你加个super();
* */
总结:
1.super只能在子类的构造函数调用父类的构造函数,而且必须放在第一位,不能在成员函数中这么使用,但可以在非静态函数中使用super调用成员函数。
2.super不能在静态函数中使用,为什么?thinking········因为super可以调非静态函数?静态方法有什么禁忌跟这个有关?知道的请慷慨的告诉我,感激不尽····
如果我错了请通知我谢谢!