day3:多态
day3多态 porlamorphic
一,继承类型的多态:
文章目录
多态概述:
一个事务有多种形态(身份).
在Java中是指一个对象具有多个数据类型.
代码体现:
Java中多态的代码体现在一个子类对象(实现类对象)
既可以给这个子类(实现类对象)引用变量赋值,
又可以给这个子类(实现类对象)的父类(接口)变量赋值。
1,继承
一个父类类型的引用,指向一个子类的对象(要求子类必须重写父类的方法)
格式:
父类名 对象名 = new 子类名(实参列表)
对象名.重写的方法();
2,实现类
一个接口类型的引用,指向一个实现类的对象(实现类必须实现那个接口);
多态的好处:
可以让方法变得更加通用,提高代码的重复使用.
向上转型:
当有子类对象赋值给一个父类引用时,便是向上转型,多态本身就是向上转型的过程。
使用格式:
父类类型 变量名 = new 子类类型();
如:Animal p = new Cat()
多态本身是子类类型向父类类型向上转型的过程(数据范围变大了)
转型之后,只能调用父类中定义了并且在子类中重写后的方法.
向下转型:
一个已经向上转型的子类对象可以使用强制类型转换的格式,
将父类引用转为子类引用,这个过程是向下转型。
如果是直接创建父类对象,是无法向下转型的!(需要强制类型转换)
格式:
子类类型 变量名 = (子类类型) 父类类型的变量;
如:Cat c = (Cat) a; //变量p 实际上指向Cat对象
注意:
强制类型转换是由风险的,尽量避免使用,
为了避免出现类型转换异常,可以先判断对象是否为目标类型的对象
判断一个对象是否为某种类型,使用instanceof,判断结果为boolean
二,接口类型的多态
格式:
接口名 对象名 = new 实现类(实参列表)
要求:实现类必须实现接口
实现类中必须实现接口定义的抽象方法.
对象名.方法名(实参列表)
要求:
这里调用的方法必须时实现类实现过的方法,不能调用实现类中特有的方法
好处:与继承相同
三,多态特点:
1,继承的形式:
一个父类类型的引用,指向一个子类的对象(要求子类必须重写父类的方法)
格式:
父类名 对象名 = new 子类名(实参列表)
对象名.重写的方法();(要求在父类中定义过,并且被子类重写的方法,不能调用子类特有方法)
2,接口的形式
格式:
接口名 对象名 = new 实现类(实参列表)
要求:实现类必须实现接口
实现类中必须实现接口定义的抽象方法.
对象名.方法名(实参列表)
要求:
这里调用的方法必须时实现类实现过的方法,不能调用实现类中特有的方法
1.1 案例介绍
定义USB接口(具备开启功能、关闭功能),笔记本要使用USB设备,即笔记本在生产时需要预留可以插入USB设备的USB接口,即就是笔记本具备使用USB设备的功能,但具体是什么USB设备,笔记本并不关心,只要符合USB规格的设备都可以。鼠标和键盘要想能在电脑上使用,那么鼠标和键盘也必须遵守USB规范,不然鼠标和键盘的生产出来无法使用
进行描述笔记本类,实现笔记本使用USB鼠标、USB键盘
l USB接口,包含开启功能、关闭功能
l 笔记本类,包含运行功能、关机功能、使用USB设备功能
l 鼠标类,要符合USB接口
l 键盘类,要符合USB接口
1.2 案例需求分析
阶段一:
使用笔记本,笔记本有运行功能,需要笔记本对象来运行这个功能
阶段二:
想使用一个鼠标,又有一个功能使用鼠标,并多了一个鼠标对象。
阶段三:
还想使用一个键盘 ,又要多一个功能和一个对象
问题:每多一个功能就需要在笔记本对象中定义一个方法,不爽,程序扩展性极差。
降低鼠标、键盘等外围设备和笔记本电脑的耦合性。
实现代码步骤
l 定义鼠标、键盘,笔记本三者之间应该遵守的规则
interface USB {
void open();// 开启功能
void close();// 关闭功能
}
l 鼠标实现USB规则
class Mouse implements USB {
public void open() {
System.*out*.println("鼠标开启");
}
publicvoid close() {
System.*out*.println("鼠标关闭");
}
}
l 键盘实现USB规则
class KeyBoard implements USB {
publicvoid open() {
System.*out*.println("键盘开启");
}
publicvoid close() {
System.*out*.println("键盘关闭");
}
}
l 定义笔记本
class NoteBook {
// 笔记本开启运行功能
public void run() {
System.*out*.println("笔记本运行");
}
// 笔记本使用usb设备,这时当笔记本对象调用这个功能时,必须给其传递一个符合USB规则的USB设备
public void useUSB(USB usb) {
// 判断是否有USB设备
if (usb != null) {
usb.open();
usb.close();
}
}
public void shutDown() {
System.*out*.println("笔记本关闭");
}
}
public class Test {
publicstaticvoid main(String[] args) {
// 创建笔记本实体对象
NoteBook nb = new NoteBook();
// 笔记本开启
nb.run();
// 创建鼠标实体对象
Mouse m = new Mouse();
// 笔记本使用鼠标
nb.useUSB(m);
// 创建键盘实体对象
KeyBoard kb = new KeyBoard();
// 笔记本使用键盘
nb.useUSB(kb);
// 笔记本关闭
nb.shutDown();
}
}
三,static关键字
静态修饰符,一般用来修饰类的成员,被static修饰的成员属于类,不属于单个这个类的某个对象
static修饰的成员被多个对象共享.
static修饰的成员属于类,但是会影响每一个对象。
static修饰后成员的使用:被static修饰的成员可以并且建议通过类名直接访问
格式:
类名.静态成员变量名
类名.静态成员方法名(参数)
}
#### 三,static关键字
静态修饰符,一般用来修饰类的成员,被static修饰的成员属于类,不属于单个这个类的某个对象
static修饰的成员被多个对象共享.
static修饰的成员属于类,但是会影响每一个对象。
static修饰后成员的使用:被static修饰的成员可以并且建议通过类名直接访问
格式:
类名.静态成员变量名
类名.静态成员方法名(参数)