java派生_Java基类和派生类

从外部看来,派生类是一个与基类具有相同接口的新类,或许还会有一些额外的的方法和域 。但继承并不仅仅是类的复用。当创建了一个派生类的对象时,该类包含了一个基类的子对象。这个子对象和你用基类直接创建的对象没有什么两样。二者的区别在于,后者来自于外部,而基类的子对象来自于派生类对象的内部。对基类的子对象初始化时至关重要的,而且也只有一种方法来保证这一点,那就是在派生类的构造器中调用基类的构造器,而基类的构造器具有执行基类初始化所需的所有能力和知识。

在无参构造器时, java会自动在派生类的构造器中插入对基类的构造器的调用。

2d37e97ef5562b1b0bc8a646e5015f00.png

42434a5be01c0737233392b5f4adde70.png

714bab346c51adb89251830f5c92aafc.png

输出结果为:

我是人!

我是学生!

可以发现,总是基类的构造器先被初始化。

但是当构造器有参数时,那就必须使用关键字super现实地编写调用基类构造器的代码,并且匹配适当的参数列表。

ccb02da27dc00ae6b4623ba70113262a.png

3ff718d2ae37d8dcdf11b0c9bb428892.png

c4611d1adf2ce9c683f534aa7d5b487c.png

输出结果:

我是叫zhangsan的人

我是学生!

如果注释掉上面的super(name);将会报错。原因是派生类必须调用基类构造器。因为实例化派生类时,基类也会被实例化,如果不调用基类的构造器,基类将不会被实例化,所以派生类没有调用基类构造器会报错。

但是如果Humans的代码变成这样就不会错。如下代码:

bdcb7c388cf2c1aafe218a3e2211e2d1.png

f56bdf6ea56eae45af0660296fe7bf79.png

1d9fef85be13b74c0bf50fb60221b38a.png

输出结果为:

我是人!

我是学生!

原因是,如果基类有一个无参的构造器,就算派生类不用super显示调用基类的构造函数,编译器也会自动

去调用基类的无参构造函数。

所以上面的代码不会报错,输出结果也不是

我是叫zhangsan的人

我是学生!

而是

我是人!

我是学生!

派生类继承了基类的所有public和protected属性和方法,代码如下:

13b7bfdac85f55b2b600cb636fca3c5d.png

2794210776ca0b27c2838c368367730f.png

392144ebec878a1fc915fdbb3ba50cdc.png

上面的System.out.println(s.name);会报错,因为name是private属性,如需访问,采用get方法:

4005f023ec96f539baf474d872ae3557.png

输出结果为:

zhangsan

10

如果派生类定义了和基类一样的属性或方法,将覆盖基类的属性和方法。如将student改为如下代码:

05cf1a9bd726cf398e60c3947a25c338.png

输出结果为:

null

null

0

因为只有基类的属性在构造时赋值了,派生类的没有,当访问这些属性时,访问的是派生类的属性,所以全为null或者0。

只有当派生类的属性也被实例化时,才会得到属性的值。代码改为如下:

4ba6722fef4b278bbd0615381225cf2f.png

输出结果为:

zhangsan

10

要注意的是,super必须在构造器的最前面,不然会报错

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值