DAY 9
一、多态
1.多态是什么
多态是某一个事物在不同时刻或者不同条件下表现出来的不同状态。
java语言中的多态:“同一个对象”的行为(方法),在不同的时刻或条件下,表现出不同的效果。
2.多态的发生
多态的发生条件:
- 继承(多态一定要继承行为)
- 子类,一定要覆盖父类中,要发生多态的方法(行为)
- 父类引用指向子类实例
3.多态
多态:
- 编译时多态(方法重载):
2. 运行时多态:今天所讲的多态
4.多态中成员访问的特点
成员属性和成员方法:
编译看左边:
引用变量的类型,规定了我们通过引用变量能访问到的对象的成员
运行看右边:
究竟实际执行的方法
多态的优缺点
优点:
- 解决代码冗余的问题
- 使我们的程序可扩展性更好
缺点: - 多态不能访问子类特有的方法
(为了解决多态无法访问子类特有的方法,我们可以使用向上转型和向下转型。)
为了保证向下转型是安全的,这里我们采用instanceof来判断当前对象是否是当前类的对象。
instanceof语法:对象名 instanceof 类名
返回值是boolean型;
**注意:**null instanceof 任意类型结果都是false
二、抽象类
1.引入
- 当一个方法只有方法声明的时候,也就意味着它没有具体的方法实现,——> 抽象方法 必须使用abstract关键字来定义
2. 当一个类中包含了抽象方法,那么这个类似乎是不完整的, ——> 抽象类
2.什么是抽象类
抽象类的定义:包含有抽象方法的类或被abstract修饰的类
3.抽象类的特征
1.抽象类和抽象方法必须用abstract关键字修饰
abstract class 类名 {}
public abstract void eat();
2. 抽象类不一定有抽象方法,有抽象方法的类一定是抽象类
3. 抽象类不能直接实例化, 间接实例化
Animal animal = new Cat();
4. 抽象类的子类
a. 可以是抽象类
b. 也可以是具体类
抽象类的成员特点:
-
构造方法:同普通类 也就是说抽象类和普通,都可以有构造方法
-
成员变量:同普通类
-
成员方法:可以是抽象方法,也可以是具体的普通方法
abstract关键字不能与哪些关键字同用
- final关键字
- static关键字
- private关键字
原因在于这些关键字修饰的方法都无法被覆写,但是抽象方法必须被覆写,与之矛盾
三、接口
定义
接口: 接口在java语言中和class是并列关系 -> 也表示一种类型
格式
接口用关键字interface表示
格式:interface 接口名 {}
在接口定义中:
- 成员变量默认修饰符: public static final
- 成员方法而言默认修饰符:public abstract
接口的组成特征
(jdk1.7及以前):
- 成员变量: 只能是自定义常量
- 成员方法: 只能有抽象方法
jdk8及以后接口中,不仅仅可以有抽象方法,还可以有:
- 默认方法
- 静态方法
接口和类从类型表示的角度来讲侧重点不一样
类: 从数据集合和基于这组数据集合的操作来表示类型
接口:重在描述一个功能的集合(抽象)
接口不能直接实例化, 但是可以间接实例化 MyInterface m = new 子类名
类和接口的关系
类和接口有关系:类实现接口用implements表示 (implements实现关系,可以理解为一种继承关系)
接口的子类:
- 未实现接口中声明的,所有抽象方法,此时只能是抽象类
- 如果子类实现了,接口中所声明的所有的抽象方法, ——> 普通类
接口与抽象类比较
java 所谓实现了多重继承? ——> 接口实现了真正多重继承
抽象类 vs 接口:
- 都可以包含抽象方法
- 抽象类和接口都可以表示类型
成员的区别:
- 抽象类有构造方法,接口没有
- 抽象类成员变量和普通类没有任何区别,接口成员变量只能是自定义常量
- 抽象类可以包含普通方法,接口只能包含抽象方法(jdk1.7及之前)
关系的区别
- 类与类 继承(单重继承)
- 类与接口 实现,单实现,多实现
- 接口与接口 继承,单继承,多继承
设计理念区别
- 抽象类 被继承体现的是:”is a”的关系。描述继承关系中子类和父类的关系
- 接口 被实现体现的是:”like a”的关系
来源:CSDN
作者:zhouchendd
链接:https://blog.csdn.net/zhouchendd/article/details/103881231