多态

举报
@小红花 发表于 2022/02/25 16:21:24 2022/02/25
【摘要】 多态的基础语法:学习多态基础语法之前,我们需要普及两个概念:第一个:向上转型子------->父 (自动类型转换) 第二个:向下转型父----->子(强制类型转换,需要加强制类型转换符) java中允许向上转型,也允许向下转型。无论是向上转型,还是向下转型。两种类型必须有继承关系,没有继承关系编译器报错。 多态指的是:父类型引用指向子类型对象。包括编译阶段和运行阶段。编译阶段:静态绑定父类的...
  • 多态的基础语法:
    • 学习多态基础语法之前,我们需要普及两个概念:
      • 第一个:向上转型
        • -------> (自动类型转换)
        • 11ma1 as = new Cat() 
; / / 底 层 对 象 是 一 只 猫 ·

 

  • 第二个:向下转型
    • ----->子(强制类型转换,需要加强制类型转换符)

 

java中允许向上转型,也允许向下转型。无论是向上转型,还是向下转型。两种类型必须有继承关系,没有继承关系编译器报错。

 

  • 多态指的是:
    • 父类型引用指向子类型对象。
    • 包括编译阶段和运行阶段。
    • 编译阶段:静态绑定父类的方法。
    • 运行阶段:动态绑定子类型对象的方法。
    • 多种形态。

 

什么时候必须使用向下转型?

不要随便做强制类型转换。因为强转有风险

当你需要访问的是子类对象中特有的方法,此时必须进行向下转型。

向下转型需要进行强制类型转换。

 

  • 新的运算符:instanceof
    • 1、instanceof可以在运行阶段动态判断引用指向的对象的类型。
    • 2、instanceof语法:
      • (引用 instanceof 类型)
    • 3、instanceof运算符的运算结果只能是:true/false
    • 4、假如c是一个引用,c变量保存了内存地址指向了堆中的对象。
      • 假设(c instanceof Cat)为true表示:
        • c引用指向的堆内存中的java对象是一个Cat
      • 假设(c instanceof Cat)为false表示:
        • c引用指向的堆内存中的java对象不是一个Cat

 

if()6 instanceof cat) { / / 负L果a6 是 一一 只 cat 
cat y · (cat)a6; / / 再 进 行 强 制 类 型 转 换 
y.catchMouse() ;

 

 

程序员要养成一个好习惯:

任何时候,任何地点,对类型进行向下转型时,一定要使用instanceof 运算符进行判断。

 

软件在扩展过程当中,修改的越少越好。

修改的越多,你的系统当前得到稳定性就越差,未知的风险就越多。

高手开发项目不是仅仅为了实现客户的需求,还需要考虑软件的扩展性。

 

软件开发原则有七大原则(不属于java,这个开发原则属于整个软件业)。

其中有一条最基本的原则:OCP(开闭原则)

 

什么是开闭原则?

对扩展开放(可以额外添加),对修改关闭(最好很少的修改)。

在软件的扩展过程当中,修改的越少越好。

 

 

多态在开发中有什么作用?

降低程序的耦合度,提高程序的扩展力。

public class Master(){

public void feed(Dog d){}

public void feed(Cat c){}

}

以上代码中表示MasterDog以及Cat的关系很紧密(耦合度高),导致扩展力强很差。

public class Master(){

public void feed(Pet pet){}

pet.eat();

}

以上代码中降低了耦合度,提高了软件的扩展力。

 

  • 面向对象的特征:
    • 封装,继承,多态
    • 真是一环扣一环
    • 有了封装,有了这种整体的概念之后。
    • 对象和对象之间产生了继承。
    • 有了继承,才有了方法的覆盖和多态。

 

方法覆盖需要和多态机制联合起来使用才有意义。

假设没有多态机制,只有方法覆盖机制,你觉得有意义吗?

没有多态机制,方法覆盖可有可无。

没有多态机制,方法覆盖也可以没有,如果父类的方法无法满足子类业务需求的时候,子类完全可以定义一个全新的方法。

 

静态方法存在方法覆盖吗?

多态自然就和对象有关系了。

而静态方法的执行不需要对象了。

所以,一般情况下,我们会说静态方法不存在方法覆盖。

 

私有方法不能覆盖。

静态方法不谈覆盖。

 

对于返回值类型是基本数据类型来说,必须一致。

对于返回值类型是引用数据类型来说,重写之后返回值类型可以变得更小。(但是意义不大,开发当中没有人这么写)

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。