JavaSe面向对象08:什么是多态(笔记)

视频学习地址

点我跳转ψ(`∇´)ψ

前言

即同一方法可以根据发送对象的不同采用多种不同的行为方式。

一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多(父类和有关系的类)

public class Application {
    public static void main(String[] args) {
        //一个对象的实际类型是确定的
        //new Person();
        //new Student();

        //可以指向的引用类型就不确定了

        //能调用的方法都是自己的或者是父类的
        Student s1 = new Student();
        //可以指向子类,但是不能调用子类独有的方法
        Person s2 = new Student();
        Object s3 = new Student();  //父类的引用指向子类

        s1.run();
        s2.run();   //子类重写了父类的方法,故执行了子类的方法

        s1.eat();
        s2.eat();   //因为左边的类型是父类的,而父类并没有eat方法,故报错
    }
}
public class Person {
    public void run(){
        System.out.println("run");
    }
}
public class Student extends Person{
    @Override
    public void run() {
        System.out.println("not run");
    }
    public void eat(){
        System.out.println("eat");
    }
}

注意事项

  • 多态是方法的多态,属性没有多态
  • 类型转换异常:ClassCastException
  • 多态的存在条件必须有一个继承关系
  • 子类需要重写父类的方法
  • 父类引用指向子类对象:Father f1 = new Son();

不能被重写的方法

  • static:属于类,不属于实例
  • final:属于常量池,不能重写
  • private:私有的方法,不能重写

故事

假设你要写一个狗狗叫的程序,所以建了一个dog类并定义了一个成员函数shout,当被调用时显示“汪汪”,那么主函数里实例化对象d后,调用d.shout()即可显示“汪汪”。

后来你觉得程序只会模拟狗狗叫很单调,所以你又定义了一个cat类,同样实现了shout函数,被调用时显示“喵喵”。这时你必须更改主函数中的实例化代码,把dog类名改为cat(每次只能实例化一个类对象)。这样一来调用shout的语句不用改,重新编译运行就会显示“喵喵”。可此时又不能显示“汪汪”了,每次切换都要改实例化代码更改类名,非常麻烦,如果是个大项目每次编译好还要部署,这种维护方案是不能接受的。

因此必须调整架构解决这个问题,所以我们进行如下改造:建一个虚基类pet,具有所有成员函数定义,但不含实现(接口),shout函数是虚函数。dog和cat继承pet。主函数中使用pet定义一个基类指针。并且增加一个从键盘读取按键的功能,代码中并不直接实例化对象,而是通过键盘接受按键动态创建dog或者cat对象,比如当用户输入d,则创建dog对象,如果输入c则创建cat对象,像这样p=new dog()或p=new cat(),用if语句判断选择要创建哪个类对象。然后调用p->shout()。这样一来,当输入d时就显示“汪汪”,输入c时显示“喵喵”,而不用反复编译代码了。

这是个简单的多态例子,实际上真正的项目是通过配置文件定义程序的运行模式的,那么程序中还要增加配置文件管理模块,那是另外一个话题了。

这样每当需要增加一种宠物时只要增加一个类,因此大型程序都是将类封装在dll中,项目扩充时只需编译dll就行了,当然,主程序中也不能用if语句,那样主程序还得增加一个判断重新编译,因此就出现了一种设计模式叫工厂模式,结合配置文件完全解决在主要业务逻辑不变的情况下不用重新编译主程序就能轻松扩充程序功能。软件界面中则可以增加编辑配置项而实现随时更改程序的功能和行为而不用重新编译。

很多软件更新时大部分情况都是更新dll文件,就是这个原因。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值