【JAVA】重写、重载与继承

头一次学到重写与重载的时候,傻傻的分不清二者的作用以及表现形式。虽然二者都有“重”字,可是细究起来,二者的性质却并不同。

重写(override):子类中,重写父类的构造函数除了名字、参数和返回值相同外,大括号里面的内容(方法体)是不相同的。

重载(overload):子类中,重载父类的构造函数除了参数不同,其他都是一样的。

然而,看了两者的概念之后,有一个问题摆在了我们面前——二者与继承的关系是怎样的?
我们先来了解一下什么是继承,说到这里,又有了“子类”和“父类”两个概念。顾名思义,父类,被继承者;子类,继承者。继承,即是将父类与子类中相同的属性抽取出来,然后我们可以在子类中添加父类中没有的属性,以达到拓展功能又节省代码的目的。简洁来说,就是实现代码的复用

子类可以继承父类里非private部分的属性,那么这里顺便就又牵扯出了子类对于父类访问权限扩展的问题。

我们先来了解一下以下四个修饰符的访问权限:private、default、protected和public.

本类同包(无关类或子类)不同包(子类)不同包(无关类)
private
default
protected
public

如上表,也就是说,如果父类是protected的属性,那么,子类只能是同样是protected的属性,或者扩展为public的属性。因为在子类向下的转型中,一些属性会丢失。 而说到子类继承父类的表现形式,我们就又不得不引入构造函数这个概念,又名构造器。

Ⅰ、构造函数的作用
当你需要大批量的写对象的时候,就需要用到构造函数,它可以方便创建多个对象的实例,并且创建的对象可以被标识为特定的类型,可以通过继承扩展代码。

Ⅱ、默认构造函数
当用户没有显式的去定义构造函数时, 编译器会为类生成一个默认的构造函数,
称为 “默认构造函数”, 默认构造函数不能完成对象数据成员的初始化, 只能给
对象创建一标识符, 并为对象中的数据成员开辟一定的内存空间。

Ⅲ、构造函数的特点
a.在对象被创建时自动执行;
b.构造函数的函数名与类名相同;
c.没有返回值类型、也没有返回值;
d.内部使用的this对象,来指向即将要生成的实例对象;
e.使用New来生成实例对象.

而这里需要说明的是,如果是用this()和super()调用父类的默认构造函数,那么this()和super()必须放在子类构造函数的第一行,不然会报错。
this()和super()是你如果想用传入当前构造器中的参数或者构造器中的数据调用其他构造器或者控制父类构造器时使用的。

那么,构造器中this 或者 super 为什么要放到第一行?

因为如果super()或者this()构造器不放在子类构造函数第一行,则编译器会自动地放一个空参数的super构造器的,其他的构造器也可以调用super()或者this(),调用成一个递归构造链,最后的结果是父类的构造器(可能有多级父类构造器)始终在子类的构造器之前执行,递归的调用父类构造器。无法执行当前的类的构造器。也就不能实例化任何对象,这个类就成为一个无为类。
从另外一面说,子类是从父类继承而来,继承了父类的属性
和方法,如果在子类中先不完成父类的成员的初始化,则子类无法使用,应为在java中不允许调用没初始化的成员。在构造器中是顺序执行的,也就是说必须在第一行进行父类的初始化。而super能直接完成这个功能。This()通过调用本类中的其他构造器也能完成这个功能。因此,this()和super()必须放在第一行。

--------------------- 作者:MWhzx 来源:CSDN 原文:https://blog.csdn.net/houzuoxin/article/details/38977573

现在,我们已经知道了继承的要点,以及与其相关的一些概念。接下来,我们就讨论一下
重写、重载与继承的关系

继承里面用的大部分的方法是重写,是不能引用父类private属性的。所以父类和子类的构造函数普遍都是public属性,这样也方便子类访问父类构造函数的内容,而私有的东西就用private封装起来,不让子类继承。
而重载不同,因为重载可以是在本类里头,复用构造函数,仅对构造函数的参数进行修改,也可以是在子类里对父类的继承。即"继承可以重载,但是重载不一定继承。"

重载的特点可以概括如下:

a.被重载的方法必须改变参数列表(参数个数或类型或顺序不一样);
b.被重载的方法可以改变返回类型; c.被重载的方法可以改变访问修饰符;
d.被重载的方法可以声明新的或更广的检查异常(区别于重写);
e.方法能够在同一个类中或者在一个子类中被重载。
注意:参数列表必须不同!

继承的其他问题
Java不支持多继承

为什么java不支持多继承呢?因为容易造成不必要的混乱。比如说:
/**
1、结构复杂化:如果是单一继承,一个类的父类是什么,父类的父类是什么,都很明确,因为只有单一的继承关系,然而如果是多重继承的话,一个类有多个父类,这些父类又有自己的父类,那么类之间的关系就很复杂了。
2、优先顺序模糊:假如我有A,C类同时继承了基类,B类继承了A类,然后D类又同时继承了B和C类,所以D类继承父类的方法的顺序应该是D、B、A、C还是D、B、C、A,或者是其他的顺序,很不明确。
3、功能冲突:因为多重继承有多个父类,所以当不同的父类中有相同的方法是就会产生冲突。如果B类和C类同时又有相同的方法时,D继承的是哪个方法就不明确了,因为存在两种可能性。
当然,多继承的这些问题很多语言已经解决了,比如c++,python等,但并不是所有的语言都有必要去解决这个问题。java的类虽然不能实现多继承,但是java的接口支持多实现。

继承的缺点

继承是一种强耦合关系,父类变,子类就必须变;
继承破坏了封装,对于父类而言,它的实现细节对与子类来说都是透明的。 作者:Sharember
来源:CSDN
原文:https://blog.csdn.net/qq_31655965/article/details/53393934

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_临渔_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值