Java 构造器的秘密

1. 子类实例化也调用父类的构造函数

首先咱们看看下面的代码: java

class Super {
    String s;
 
    public Super(){
    	System.out.println("Super");
    }
}
 
class Sub extends Super {
 
    public Sub(){
    	System.out.println("Sub");
    }
 
    public static void main(String[] args){
    	Sub s = new Sub();
    }
}



后台结果是:

Super
Sub
函数


在上面的代码中,其实子类并无调用Super()这个方法,可是子类实例化的时候仍是调用了父类的构造函数。这是由于,若是子类的构造器没有显示的调用super()这个方法,编译器会自动插入super()这条语句到子类构造器中。这样设计就使子类的实例化必须调用父类的构造函数,由于父类里面若是有私有的成员变量子类是没法察觉的,仍是须要用父类的构造器初始化父类的私有成员变量。 spa

2. 编译报错:父类构造器没有定义

这样的报错是由于,编译器在编译的时候,若是子类 的构造器没有显示的调用super(),编译器也会默认在子类构造器中插入super(),但此时父类并无无参构造器,因此上面的代码就报错了。解决方案有不少种:
1. 在父类中声明一个无参构造函数
2.之类的构造器中调用super(value)
3.去掉父类中的构造函数,这样编译器会自动的为父类加一个无参构造函数 设计

3. 总结

总之,子类的构造器必定会调用父类的构造器,无论是显示调用仍是隐式的调用,父类里面必定要定义相应的构造函数。 code

文章来源: http://www.programcreek.com/2013/04/what-are-the-frequently-asked-questions-about-constructors-in-java/ get

相关文章
相关标签/搜索