java 初始化父类的构造函数 supper "supper"_(深刻理解默认构造器,super,继承)一个子类继承父类的例子(欢迎指正批评补充)...

(深刻理解默认构造器,super,继承)一个子类继承父类的例子(欢迎指正批评补充)

(2011-10-04 15:47:56)

标签:

杂谈

class TestSuper{

TestSuper(int i){}

}

class TestSub extends TestSuper{

}

public class TestAll{

public static void main(String args[]){

new TestSub();

}

}

不能编译成功

解决方法1:在子类TestSub中添加下面的构造:

public TestSub() {

super(0);

}

解决方法2:在TestSuper类添加无参数构造函数TestSuper(){}

或:在TestSub添加无参数构造函数TestSub (){}

更简单的理解:如果不调用子类内的基础类构造器(TestSuper),编译器就会报告自己找不到TestSuper()形式的一个构造器,除此以外,在子类构造器中,对超类构造器的调用是必须做的第一件事情,

编译器会强迫我们在子类构造器的主体中首先设置对超类构造器的调用,这意味着,在它之前不能出现任何东西。所以我们看到::注意:使用super调用构造器的语句必须是子类构造器的第一条语句

因为每个类在没有显式定义构造函数时默认构造函数是无参构造函数,当定义了显式构造函数时候就没有默认构造函数了。构造子类时,如果子类没有定义构造函数,就调用父类的构造函数

我试着解释一下其中的原理:(欢迎指正批评补充)

由于子类(TestSub)的构造器不能访问超类(TestSuper)的私有域,所以必须利用子类TestSub的构造器对超类的私有域进行初始化,通过super实现对超类(TestSuper)构造器的调用,(注意:使用super调用构造器的语句必须是子类构造器的第一条语句).

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

(注意:

如果在编写一个类时没有编写构造器,系统就会提供一个默认构造器,同时这个默认构造起将所有的实例域设置为默认值,例如:实例域中的数值型数据设置为0、布尔型数据设置为false、所有对象变量将设置为null。

如果类中提供了至少一个构造器,但是没有提供默认的构造器,那么在构造对象时若不提供构造参数就被视为不合法。例如:TestSuper类提供了一个简单的构造器:

TestSuper(int i){}

对于这个类,调用默认构造器属于不合法:也就是调用:

x = new TestSuper();将产生错误.)

如果类中提供了至少一个带参数的构造器,没有提供没有参数的构造器,系统将不会提供默认构造器.(上边我们已经看到).

回到本题中,子类TestSub类的构造器并没有显式地调用超类TestSuper构造器,则将自动地调用超类TestSuper默认(没有参数)的构造其,但是超类TestSuper并没有提供不带参数的构造器,并且子类TestSub的构造器中有没有显式地调用超类TestSuper的其他构造器,(例如:TestSuper(int

i){});所以java编译器将报告错误

分享:

a4c26d1e5885305701be709a3d33442f.png喜欢

0

a4c26d1e5885305701be709a3d33442f.png赠金笔

加载中,请稍候......

评论加载中,请稍候...

发评论

登录名: 密码: 找回密码 注册记住登录状态

昵   称:

评论并转载此博文

a4c26d1e5885305701be709a3d33442f.png

发评论

以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值