Java中的继承和多态

目录

一、继承

1、继承的概念

2、继承的语法

(1)关键字extends

(2)父类成员访问

(3)super

a.子类方法中访问父类的成员

b.将基类继承下来的成员构造完整

c.super和this的比较

(4)final关键字

二、组合

三、多态

1、多态的概念

2、多态实现条件

3、代码举例

4、重写

(1)重写的概念

(2)重写的规则

5、向上转型和向下转型

(1)向上转型

(2)向下转型

6、动态绑定


一、继承

Java在面向对象的思想中提出了继承的概念,以便更好的实现代码的共性提取以及代码的复用

1、继承的概念

如图所示,Dog类和Cat类继承了Animal类,其中Dog类和Cat类被称为子类或派生类,Animal类被称为父类或基类或超类,它们的关系也如父子一样,Dog和Cat通过继承Animal来复用Animal中的成员,也就是说子类可以复用父类中成员,子类在实现时只需关心自己新增加的成员即可

Java不支持多继承,也就是一个子类最多只能对应一个父类

2、继承的语法

(1)关键字extends

在Java中通过关键字extends来表示继承关系

举例:

注意:

1. 子类会将父类中的成员变量或者成员方法继承到子类中了

2. 子类继承父类之后,必须要新添加自己特有的成员,体现出与基类的不同,否则就没有必要继承了

(2)父类成员访问

a. 子类访问父类成员变量:遵循就近原则,如果子类自己有则用自己的,没有则用父类的,都没有报错,当子类和父类的成员变量同名时,优先使用子类的

b. 子类访问父类成员方法:与变量访问一致,也遵循就近原则,如果有子类和父类的方法发生重载的情况,选择参数合适的那个方法

但若子类中存在与父类中相同的成员时,那如何在子类中访问父类相同名称的成员呢?我们可以通过super关键字来解决这个问题

(3)super

a.子类方法中访问父类的成员

Java提供了super关键字,该关键字主要作用:在子类方法中访问父类的成员

在子类方法中,如果想要明确访问父类中成员时,借助super关键字即可

【注意事项】

1. 只能在非静态方法中使用(这点和this关键字相同)

2. 在子类方法中,访问父类的成员变量和方法

b.将基类继承下来的成员构造完整

子类对象构造时,需要先调用父类构造方法,然后执行子类的构造方法:

当父类构造方法有参数时,子类构造方法中需要由自己添加带参的super()来将基类继承下来的成员构造完整,然后再调用子类自己的构造方法,将子类自己新增加的成员初始化完整

c.super和this的比较

相同点:

1. 都是Java中的关键字

2. 只能在类的非静态方法中使用,用来访问非静态成员方法和字段

3. 在构造方法中调用时,必须是构造方法中的第一条语句,并且不能同时存在

不同点:

1. this是当前对象的引用,当前对象即调用实例方法的对象,super相当于是子类对象中从父类继承下来部分成 员的引用

2. 在非静态成员方法中,this用来访问本类的方法和属性,super用来访问父类继承下来的方法和属性

3. 在构造方法中:this(...)用于调用本类构造方法,super(...)用于调用父类构造方法,两种调用不能同时在构造方法中出现

4. 构造方法中一定会存在super(...)的调用,用户没有写编译器也会增加,但是this(...)用户不写则没有

(4)final关键字

final关键字可以用来修饰变量、成员方法以及类

修饰变量:使变量值不能被改变

修饰成员方法:使成员方法无法被重写

修饰类:使类无法被继承

二、组合

和继承类似, 组合也是一种表达类之间关系的方式, 也是能够达到代码重用的效果

组合并没有涉及到特殊的语法 (诸如 extends 这样的关键字), 仅仅是将一个类的实例作为另外一个类的字段

继承表示对象之间是is-a的关系,比如:狗是动物,猫是动物

组合表示对象之间是has-a的关系,比如:汽车有轮胎、发动机、车载系统

三、多态

1、多态的概念

多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态

2、多态实现条件

在java中要实现多态,必须要满足如下几个条件,缺一不可:

1. 必须在继承体系下

2. 子类必须要对父类中方法进行重写

3. 通过父类的引用调用重写的方法

多态体现:在代码运行时,当传递不同类对象时,会调用对应类中的方法

3、代码举例

运行结果:

4、重写

(1)重写的概念

重写(override)是子类对父类方法进行重新编写

(2)重写的规则

a.子类的返回值类型、方法名、参数要求和父类必须相同(返回值类型也可以不同,但是必须是具有父子关系的)

b.父类方法不能被private  static  final修饰,构造方法不能重写

c.子类的访问权限要大于等于父类的访问权限。例如:如果父类方法被public修饰,则子类中重写该方法就不能声明为 protected(只能是public)

5、向上转型和向下转型

(1)向上转型

a.向上转型:实际就是创建一个子类对象,将其当成父类对象来使用,父类类型引用子类对象

b.语法格式:父类类型 对象名 = new 子类类型()

animal是父类类型,但可以引用一个子类对象,因为是从小范围向大范围的转换

c.使用场景:直接赋值、方法传参、方法返回

(2)向下转型

与向上转型相反,向下转型是由大范围到小范围的转变,因此必须类型强制转换

向下转型用的比较少,而且不安全,万一转换失败,运行时就会抛异常。Java中为了提高向下转型的安全性,引入 了instanceof,如果该表达式为true,则可以安全转换:

6、动态绑定

动态绑定的两个条件:

(1)向上转型

(2)父类的方法在子类中重写

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值