前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >理解面向对象特性之多态

理解面向对象特性之多态

作者头像
JanYork_小简
发布2022-03-29 12:31:45
7440
发布2022-03-29 12:31:45
举报
文章被收录于专栏:小简技术栈小简技术栈

何为多态

多态性是面向对象编程的又一个重要特征,它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义

啥意思呢?就是说,在继承的基础上,一个父亲与多个儿子,父亲善于运动,儿子继承了父亲的特点,也善于运动,但是每个儿子各不相同,这样就体现了多种形态,可能大儿子善于跑步,二儿子善于跳高等等。

对面向对象来说,多态分为编译时多态运行时多态。其中编译时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的方法。通过编译之后会变成两个不同的方法,在运行时谈不上多态。而运行时多态是动态的,它是通过动态绑定来实现的,也就是大家通常所说的多态性

本质上来说,方法的重载就是多态的一种特别的体现!

多态优势

  • 消除类型之间的耦合关系
  • 可替换性
  • 可扩充性
  • 接口性
  • 灵活性
  • 简化性

多态存在的三个必要条件

  • 继承关系
  • 方法重写
  • 父类引用指向子类对象

父类引用指向子类,也就是这样:Parent p = new Child()也就是向上转型

演示

我们先创建了三个类

父类

代码语言:javascript
复制
//父亲
public class Father {
    public void Sports(){
        System.out.println("跑步");
    }
}

子类

代码语言:javascript
复制
//儿子一
public class Son1 extends Father {
    @Override
    public void Sports() {
        System.out.println("游泳");
    }
}
代码语言:javascript
复制
//儿子二
public class Son2 extends Father {
    @Override
    public void Sports() {
        System.out.println("跳高");
    }
}

测试类

代码语言:javascript
复制
入口(输出)类
public class Demo {
    public static void main(String[] args) {
        Father father = new Son1();
        father.Sports();
        //将对象更换成第二个儿子
        father = new Son2();
        father.Sports();
    }
}

看这个类,它new对象时,是通过Fathernew出了它其中的儿子类,Son1,而后,我调用了输出方法。

之后我跟换成第二个儿子,也调用输出方法。

结果

从这发现,它不是输出父类的方法,而是根据不同子类输出不同子类的方法

注意

我在子类添加一个方法,注意,父类没有相同方法,也就是说没有重写!!!

代码语言:javascript
复制
public class Son1 extends Father {
    @Override
    public void Sports() {
        System.out.println("游泳");
    }
    
    public void eat(){
        System.out.println("吃蛋白粉!");
    }
}

我们调用输出一下eat方法

转型

我们上面的方法是使用向上转型,相当于从小转大,不需要强转。

但是我如果想将小转到大呢?

我们可以这么写:子类类型 变量名=(子类类型) 父类类型的变量;

代码语言:javascript
复制
public class Demo {
    public static void main(String[] args) {
        Father father = new Son1();
        Son1 son1 = (Son1)father;
        son1.eat();
    }
}

这样我们就可以直接通过子类对象访问子类方法了。

判断

Java为我们提供一个关键字instanceof ,它可以帮助我们避免了ClassCastException 类型转换异常的发生。

变量名instanceof数据类型。

  • 如果变量属于该数据类型或者其子类类型,返回true。
  • 如果变量不属于该数据类型或者其子类类型,返回false。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022 年 03 月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 何为多态
  • 多态优势
  • 多态存在的三个必要条件
  • 演示
  • 注意
  • 转型
  • 判断
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档