目录
1.多态
1.类的多态
我们来简单实现一个需求,老师骑着自行车上班,这时候我们就需要建一个人物类,自行车类,然后分别在实体类里面写上方法,一般我们的思想就是这样,但是假如我需求升级,现在老师是做小轿车去上班,好,这时候我们需变动我们创建的自行车类,然后再写方法和属性,但是就需要修改原来的代码,我们在写代码的时候其实默认都遵守一个规则,叫ocp原则(开闭原则),O- open,在需求升级的时候,对于创建类是欢迎的,C-close,在需求升级时,对于修改原有类时拒绝的,针对这个原则,我们是可以使用多态来写。
我们把小车和自行车相同的元素提取出来,创建为一个交通工具抽象类,然后我的小车类和自行车类来继承我的父类,然后在我的子类中重写我需要的方法,就可以达到我无论变成什么交通工具,都不用修改原来的代码。
主方法:
public class Test01 {
public static void main(String[] args) {
Teacher t = new Teacher();
//多态:子类对象执行父类引用
//父类引用中存的是子类对象在堆中开辟的地址
Vehicle v = new Car();
t.start(v);
System.out.println("欣赏沿途的风景...");
t.stop(v);
}
}
老师类:
public class Teacher {
public void start(Vehicle v){
v.open();
}
public void stop(Vehicle v){
v.close();
}
}
交通工具类:
public abstract class Vehicle {
public abstract void open();
public abstract void close();
}
自行车类:
public class Bike extends Vehicle{
@Override
public void open(){
System.out.println("握好把手,脚蹬脚踏板");
}
@Override
public void close(){
System.out.println("手捏刹车");
}
}
小车类:
public class Car extends Vehicle{
@Override
public void open(){
System.out.println("系好安全带,一键启动,挂挡,踩油门");
}
@Override
public void close(){
System.out.println("踩刹车,挂挡,熄火,松安全带");
}
}
2.接口的多态
需求,模拟电脑连接外部设备
首先我们思考一下,这些外部设备有什么相同点,对,就是都需要插在电脑上才能用,所以我们创建一个usb接口类
public interface IUSB {
public void use();
}
键盘类去实现usb接口类
public class Keyboard implements IUSB {
@Override
public void use() {
System.out.println("键盘:输入数据");
}
}
鼠标类实现usb接口类
public class Mouse implements IUSB{
@Override
public void use() {
System.out.println("鼠标:左点点、右点点");
}
}
主方法:
public class Test01 {
public static void main(String[] args) {
Computer computer = new Computer();
//接口的多态:实现类对象指向接口的引用
//接口的引用存储的是实现类对象在堆中开辟的地址
IUSB usb = new Keyboard();
computer.connection(usb);
}
}
2.对象转型
1.向上转型:
子类类型 转 父类类型
* 可以调用父类的非私有化成员变量
* 可以调用父类的非私有化的成员方法
* 可以调用子类重写父类的成员方法向上转型其实就是多态
* 多态的优点:符合OCP原则的开发,需求更改时,项目的可维护性高
* 多态的缺点:不能调用子类独有的成员变量和成员方法
2.向下转型
父类类型转子类类型
注意:
* 首先我们要先向上转型之后,才能向下转型
* 向下转型是不安全的
比如
import java.util.Scanner;
public class Test01 {
public static void main(String[] args) {
//错误示范
//ClassCastException - 类型转换异常
Scanner scan = (Scanner) new Object();
}
}
这个时候就会报类型转换异常,就是不安全的,所以我们在用的时候一定要用instanceof来判断,否则就可能会报错。
比如我们建一个动物类:
//动物类
public class Animal {
}
然后写一个小猫类继承动物类:
public class Cat extends Animal{
public void shout(){
System.out.println("小猫:喵喵喵~~~");
}
}
写个小狗继承动物类:
public class Dog extends Animal{
public void eat(){
System.out.println("小狗吃骨头~~");
}
}
主方法:
public class Test02 {
public static void main(String[] args) {
//向上转型
Animal an = new Cat();
//向下转型
if(an instanceof Dog){//判断引用an中存储的对象是否是Dog类
Dog dog = (Dog) an;
dog.eat();
}else if(an instanceof Cat){//判断引用an中存储的对象是否是Cat类
Cat cat = (Cat) an;
cat.shout();
}
}
}