1.在实例化子类时会默认调用子类的无参构造方法,但是在执行子类构造前,会首先自动实例化父类构造,先对父类的对
象实例化。
2.调用父类构造函数,可以用super()表示。
例子一
class A{
public A(){
System.out.println("*****************");
}
}
class B extends A{
public B(){
super();//表示由子类构造调用父类构造,加不加都可以
System.out.println("#################");
}
}
public class TestJava{
public static void main(String args[]){//static方法不用实例化类便可以调用
B b = new B();
}
}
//也就是证明,在子类的构造中其实一直隐藏着一行super()语句,但是在进行无参父类构造调用的时候
//写上super()是没有意义的,我们往往是在父类没有提供无参构造的时候使用的。
例子二
class A{
public A(String name){
System.out.println("*****************");
}
}
class B extends A{
public B(String name){
super(name);
System.out.println("#################");
}
}
public class TestJava{
public static void main(String args[]){//static方法不用实例化类便可以调用
B b = new B("SMITH");
}
}
//所以在大部分情况下,出现super()往往是在需要调用父类有参构造的情况下,在大多数情况下父类一般
//都有无参构造方法,所以子类不会出现super(),而且对super()的调用必须是构造其的第一个语句。
例子三
class B extends A{
public B(String name){
System.out.println("#################");
super(name); //super()的调用必须是子类构造其的第一个语句
}
}
3.分析:关于super()与this()的问题。
之前学习过this(),表示调用本类的其他构造方法,而现在有了继承关系以后,可以由super()调用父类中指定参数的构造函数。并且这两个语句都一定要出现在首行(意味着不能同时出现这两个语句)
//不让子类的构造器里面调用父类的构造方法,在子类的构造方法出现了this();这样就不会出现super()的
//默认执行
class A{
public A(){
System.out.println("*****************");
}
}
class B extends A{
public B(){
this(ss);//这样会导致循环没有一个出口
};
public B(String name){
this();
System.out.println("#################");
}
}
public class TestJava{
public static void main(String args[]){//static方法不用实例化类便可以调用
B b = new B("SMITH");
}
}
4.总结:
(1)继承的唯一好处就是进行了功能的扩充,并且Java只支持单继承局限
(2) 子类对象实例化时一定要先实例化父类对象,然后再实例化子类自己的对象(因为子类实例化后需要使用父类的属性,父类的属性是在父类实例化后才能使用的。开辟堆栈内存空间。)