基础入门:理解Java构造器

欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入

class TestSuper{

TestSuper(int i){} //指定了一个有参数的构造器,系统将不再为该类提供默认构造器

}

class TestSub extends TestSuper{ //在这里子类未定义构造器,系统将会提供默认构造器

TestSuper(){ super();}

}

public class TestAll{

public static void main(String args[]){

new TestSub();

}

}

不能编译成功,如果我们在eclipse这样写的话,就会有错误提示。

解决方法1:

在子类TestSub中添加无参数构造函数:

public TestSub() {

super(0);

//显式调用父类的带参数的构造器

}

解决方法2:

在TestSuper类添加无参数构造函数TestSuper(){} //显式指定父类的无参构造器

更简单的理解:如果不调用子类内的基础类构造器(TestSuper),编译器就会报告自己找不到TestSuper()形式的一个构造器,除此以外,在子类构造器中,对超类构造器的调用是必须做的第一件事情,编译器会强迫我们在子类构造器的主体中首先设置对超类构造器的调用,这意味着,在它之前不能出现任何东西。所以我们看到::注意:使用super调用构造器的语句必须是子类构造器的第一条语句.因为每个类在没有显式定义构造函数时默认构造函数是无参构造函数,当定义了显式构造函数时候就没有默认构造函数了。构造子类时,如果子类没有定义构造函数,就调用父类的构造函数我试着解释一下其中的原理:由于子类(TestSub)的构造器不能访问超类(TestSuper)的私有域(private成员),所以必须利用子类TestSub的构造器对超类的私有域进行初始化,通过super实现对超类(TestSuper)构造器的调用,(注意:使用super调用构造器的语句必须是子类构造器的第一条语句).

如果子类的构造器没有显式地调用超类的构造器,那么将自动的调用超类默认(没有参数)的构造器.如果超类没有不带参数的构造器,

(注意: 如果在编写一个类时没有编写构造器,系统就会提供一个默认构造器,同时这个默认构造起将所有的实例域设置为默认值,例如:实例域中的数值型数据设置为0、布尔型数据设置为false、所有对象变量将设置为null。如果类中提供了至少一个构造器,但是没有提供默认的构造器,那么在构造对象时若不提供构造参数就被视为不合法。

例如:TestSuper类提供了一个简单的构造器:

TestSuper(int i){}

对于这个类,调用默认构造器属于不合法:也就是调用:x = new TestSuper();将产生错误.如果类中提供了至少一个带参数的构造器,没有提供没有参数的构造器,系统将不会提供默认构造器.(上边我们已经看到).

回到本题中,子类TestSub类的构造器并没有显式地调用超类TestSuper构造器,则将自动地调用超类TestSuper默认(没有参数)的构造器,但是超类TestSuper并没有提供不带参数的构造器,并且子类TestSub的构造器中有没有显式地调用超类TestSuper的其他构造器,(例如:TestSuper(int i){});所以java编译器将报告错误.

没有早一步,也没有晚一步,刚好遇上了你!

基础入门:理解Java构造器

相关文章:

你感兴趣的文章:

标签云: