5、多态 父类引用指向子类对象
5.1、类的多态
//类的多态:子类对象指向父类引用
//父类引用中存储的是子类对象在堆中的地址
OCP - 开闭原则:
- O - open :在需求升级时,对于创建类是欢迎的
- C - close:在需求升级时,改变原有代码是拒绝的
创一个抽象的交通工具类
package come.dream.test01;
public abstract class Vehicle {
public abstract void start();
public abstract void stop();
}
交通工具的两个子类:Car Bike
package come.dream.test01;
public class Car extends Vehicle{
@Override
public void start() {
System.out.println("小汽车:启动");
}
@Override
public void stop() {
System.out.println("小汽车:踩刹车");
}
}
package come.dream.test01;
public class Bike extends Vehicle{
@Override
public void start(){
System.out.println("自行车:握好扶手,踩下脚踏板");
}
@Override
public void stop(){
System.out.println("自行车:捏手刹~~~");
}
}
创建一个老师类–——使用交通工具类
package come.dream.test01;
public class Teather {
public void open(Vehicle v) {
v.start();
}
public void close(Vehicle v) {
v.stop();
}
}
创建测试类
package come.dream.test01;
public class Test01 {
public static void main(String[] args) {
Teather t = new Teather();
Vehicle v = new Car();
t.open(v);
t.close(v);
System.out.println("-------------");
Vehicle v2=new Bike();
t.open(v2);
t.close(v2);
}
}
5.2、接口的多态
//接口的多态:实现类的对象指向接口的引用
//接口的引用中,存放的是实现类对象在堆中开辟空间的地址
创建一个IUSB接口
package com.dream.test02;
public interface IUSB {
public void use();
}
创建电脑类:
package com.dream.test02;
public class Computer {
//连接usb的方法
public void connection(IUSB usb){
usb.use();
}
}
创建 鼠标、键盘、硬盘
package com.dream.test02;
public class Mouse implements IUSB{
@Override
public void use() {
System.out.println("鼠标:左点点,右点点");
}
}
package com.dream.test02;
public class Keyboard implements IUSB{
@Override
public void use() {
System.out.println("键盘:输入数据~~~");
}
}
package com.dream.test02;
public class Disk implements IUSB{
@Override
public void use() {
System.out.println("硬盘:上传文件、下载文件");
}
}
创建测试类
package com.dream.test02;
public class Test01 {
public static void main(String[] args) {
Computer computer = new Computer();
IUSB usb = new Keyboard();
computer.connection(usb);
}
}
6、对象转型
知识点:对象转型
1.向上转型:子类类型 转 父类类型
-
可以调用父类非私有化方法
-
可以调用父类非私有化属性
-
可以调用子类重写父类的方法
-
不可以调用子类属性和方法
- 注意:向上转型就是多态
- 多态的缺点:不可以调用子类自己的属性和方法
2.向下转型:父类类型 转 子类类型
- 注意:
-
1.向下转型转不好就会出现ClassCastException - 类型转换异常
-
2.向下转型一定要使用instanceof判断
创建Animal类
package com.dream.test04;
public class Animal {
}
创建狗、猫类
package com.dream.test04;
public class Dog extends Animal{
public void eat(){
System.out.println("啃骨头~~~");
}
}
package com.dream.test04;
public class Cat extends Animal{
public void shout(){
System.out.println("喵喵喵~~~");
}
}
测试类
package com.dream.test04;
public class Test01 {
public static void main(String[] args) {
Animal an = new Dog();//向上转型
if(an instanceof Cat){//判断an引用指向的对象是否是Cat类型
Cat cat = (Cat) an;//向下转型
cat.shout();
}else if(an instanceof Dog){//判断an引用指向的对象是否是Dog类型
Dog dog = (Dog) an;//向下转型
dog.eat();
}
}
}