继承和方法覆盖

8 篇文章 0 订阅
7 篇文章 0 订阅

继承
什么是继承关系:
基于某个父类对对象的定义加以拓展,而产生新的子类定义,子类可以继承父类原来的某些定义,也可以增加原来父类所没有的定义,或者覆写父类中的某些特性。

从面向对象的角度上说:继承是一种从一般到特殊的关系,是一种“is a”的关系,即子类是对父类的拓展,是一种特殊的父类,比如:狗是动物的一种特殊情况,狗属于动物。

在Java语言中,存在多个类的时候,我们使用”extends”关键字来表示子类和父类之间的关系.
语法格式: 在定义子类的时候来表明自己需要拓展于哪一个父类.
public class 子类类名 extends 父类类名
{
编写自己特有的状态和行为
}

在Java中,类和类之间的继承关系只允许单继承,不允许多继承.
也就是说一个类A,只能有一个直接的父类,不能出现类A同时继承于
类B和类C.
但是,Java中允许多重继承.
多重继承例子:
动物有胎生动物和卵生动物之分,胎生动物有老虎,老虎又分华南虎,
东北虎,孟加拉虎等。

在这里插入图片描述

在Java中除了Object类之外,每一个类都有一个直接的父类.
比如:class Student extends Person{}
我们就说此时Student的直接父类是Person.
问题: class Person{} ,此时Person的父类又是谁?
Object类是Java语言的根类(老祖宗,任何类都是Object的子类.)
class Person{} 等价于 class Person extends Object{}
Object类要么是一个类直接父类,要么是一个类间接父类.
继承关系的作用:
1):解决了代码的重复问题.
2):真正的作用,表示出一个体系.

先写父类还是先写子类:
一般的,我们在开发工程中先编写多个自定义类,写完之后,发现多个类之间存在共同的代码,此时可以抽去出一个父类.
我们以后做开发,都是基于框架/组件来做的,我们是在别人的基础之上,继续做开发.
好比,别人提供清水房,我们只需要在清水房的基础之上装修,就可以使用.
以后,我们定义新的类去继承于框架中/组件中提供的父类.

子类继承父类之后,可以拥有父类的某一些状态和行为(子类复用了父类的功能或状态).
子类到底继承了父类的哪些成员(根据访问修饰符来判断):
1):如果父类中的成员使用public修饰,子类继承.
2):如果父类中的成员使用protected修饰,子类也继承,即使父类和子类不在同一个包中.
3):如果父类和子类在同一个包中,此时子类可有继承父类中 缺省修饰符的成员.
4):如果父类中的成员使用private修饰,子类打死都继承不到.因为private只能在本类中访问.
5):父类的构造器,子类也不能继承,因为构造器必须和当前的类名相同.

方法覆盖
场景:
子类拓展了父类,可以获得父类的部分方法和成员变量。可是当父类的某个方法不适合于子类本身的特征时,此时怎么办?
**如:**企鹅(Penguin)和鸵鸟(Ostrich)是鸟类中的一个特殊品种,所以企鹅/鸵鸟类是鸟类的一个子类,但是鸟类有飞翔的功能,但是对应企鹅/鸵鸟,飞翔的行为显然不适合于它。
此时肿么办?
在这里插入图片描述

方法覆写的原则(一同两小一大):Override
一同:
① 实例方法签名必须相同。 (方法签名= 方法名 + 方法的参数列表)
两小:
② 子类方法的返回值类型是和父类方法的返回类型相同或者是其子类。
子类可以返回一个更加具体的类.
③ 子类方法声明抛出的异常类型和父类方法声明抛出的异常类型相同或者是其子类。
子类方法中声明抛出的异常小于或等于父类方法声明抛出异常类型;
子类方法可以同时声明抛出多个属于父类方法声明抛出异常类的子类(RuntimeException类型除外);
一大:
④ 子类方法的访问权限比父类方法访问权 限更大或相等。
private修饰的方法不能被子类所继承,也就不存在覆盖的概念.

判断是否是覆写方法的必杀技:@Override标签:若方法是覆写方法,在方法前或上贴上该标签, 编译通过,否则,编译出错。
只有方法存在覆盖的概念,字段没有覆盖.
方法覆盖解决的问题: 当父类的某一个行为不符合子类具体的特征的时候,此时子类需要重新定义父类的方法,并重写方法体.

方法重载和方法覆盖(方法重写)的区别:
方法重载: Overload
方法重写: Override

批判,本身二者一点关系都没有,仅仅只是因为名字很像.

方法重载: Overload
作用: 解决了同一个类中,相同功能的方法名不同的问题.
既然是相同的功能,那么方法的名字就应该相同.
规则: 两同一不同.
同类中,方法名相同,方法参数列表不同(参数类型,参数个数,参数顺序).
方法重写: Override
**作用:**解决子类继承父类之后,可能父类的某一个方法不满足子类的具体特征,此时需要重新在子类中定义该方法,并重写方法体.
规则: 一同两小,一大.
一同:父类和子类的方法签名是相同的,所以,建议:直接拷贝父类中方法的定义到子类中,再重写方法体,就OK了.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值