看了一些多态的例子(下面的代码),也发一篇自己的总结给自己看,当然欢迎各位大神能给出自己的观点能让我们受益,废话不说了,上代码

public class A {public String show(D obj) {return ("A and D");}public String show(A obj) {System.out.println((this instanceof A) + "A this instanceof A");System.out.println((this instanceof B) + "A this instanceof B");return ("A and A");}}class B extends A{public String show(B obj){return ("B and B");}public String show(A obj){System.out.println((this instanceof A) + "B this instanceof A");System.out.println((this instanceof B) + "B this instanceof B");return ("B and A");}
}class C extends B{}class D extends B{}class Test {public static void main(String[] args) {A a1 = new A();A a2 = new B();B b = new B();C c = new C();D d = new D();System.out.println("1--" + a1.show(b));System.out.println("2--" + a1.show(c));System.out.println("3--" + a1.show(d));System.out.println("4--" + a2.show(b));System.out.println("5--" + a2.show(c));System.out.println("6--" + a2.show(d));System.out.println("7--" + b.show(b));System.out.println("8--" + b.show(c));System.out.println("9--" + b.show(d));}
}
输出结果
trueA this instanceof A
falseA this instanceof B
1--A and A
2--A and C
3--A and D
trueB this instanceof A
trueB this instanceof B
4--B and A
5--A and C
6--A and D
7--B and B
8--A and C
9--A and D

总结

1。超类引用变量引用子类对象的话,只能调用超类中存在的方法,且如果该方法被子类覆盖的话,则会执行子类的方法。
声明确定可以访问的方法;实例化确定具体访问的方法。

比如a2.show(b),a2是A类,所以在A中找方法去调用,找到了show(A a),B是A的子类,所以可以调用A的show(A a),同时B覆盖重写了show(A a)所以最终调用的是B的show(A a),为什么不是show(B b)呢?因为show(B b)没有在A中声明,没有在A中声明的方法是调用不了的。

2。按优先级顺序判断调用哪个方法:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。但超类必须有声明这个方法。如果子类覆盖了这个方法,就执行子类的,没有就执行超类的

比如第四点,a2.show(b),我在A和B的show(A a)方法里添加了输出,判断this是哪个的对象,结果可以判断出第四点,this是子类B的对象。B中声明了show(B b),但是A中没有声明show(B b),所以不能调用。B中还声明了show(A a),同时A中也有这个方法,所以最后调用的是B的show(A a)

下面是其他的一些文章的总结,主要是给我自己看的

概念(看别的文章说是从书里提出的,但不知道是哪本书,有知道的请告诉我一声,谢谢)

当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。

继承链中方法调用的优先级

在多态中方法的调用机制
1.不发生继承的类调用方法时,调用哪个就用哪个,如果发生了重载,那么,可以根据参数个数,类型,顺序判断到底调用了哪一个方法

2.当发生了继承关系,但是没有向上,向下转型时,子类对象调用的方法,要么是自身独有的,要么就是自身重写的,如果没有重写,那么也会直接调用父类的方法;而父类对象则只能调用自身的方法,而无法使用子类的方法。

3.如果发生了继承,并且有向上转型的对象,那就秉承着一个原则,即:编译看左边,运行看右边。

也就是说,首先看父类中这个被调用的方法在哪里,当父类中存在这个方法时,才可以调用,并且要继续看子类中是否重写了该方法,如果重写了,就调用重写后的方法。

总结:

当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法,但是它仍然要根据继承链中方法调用的优先级来确认方法,该优先级为:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。

this.show(O)本类中是否有该方法

super.show(O)本类的父类中是否有该方法

this.show((super)O)本类中是否有参数父类的方法(即现在参数的父类类型作为参数的方法)

super.show((super)O)本类的父类中是否有参数父类的方法
————————————————
版权声明:本文为CSDN博主「elice_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/elice_/article/details/82888630

经典Java多态例子相关推荐

  1. 解耦 多态性 java_Java的多态浅谈,Java多态浅谈网站安全分享!

    Java的多态浅谈概述Java的四大基本特性:抽象,封装,继承和多态.其中,抽象,封装,继承可以说多态的基础,而多态是封装,继承的具体表现.如果非要用专业术语来描述什么是多态的话 多态是指程序中定义的 ...

  2. java的多态代码例子_java多态例子,java多态代码实例

    下面要给大家分享的是一个多态经典案例,一起来看看这个java多态简单例子吧./*多态的好处:提高了代码的维护性和扩展性: 弊端:父类不能使用子类的特有功能. 要用子类的特有功能,可以: A:创建子类对 ...

  3. 解析java多态经典习题

    解析java多态经典习题 1 题目一 1.1 题目内容 编写程序实现乐手弹奏乐器.乐手可以弹奏不同的乐器从 而发出不同的声音. 可以弹奏的乐器包括二胡.钢琴和琵琶. 实现思路及关键代码: ①定义乐器类 ...

  4. Java多态是什么,怎么实现的,多态例子代码

    目录 子类型和子类 多态分两种 多态的用途 多态的转型 运行时多态的例子 多态实现的机制 JVM 部分内容摘自: Java多态的实现机制是什么,写得非常好!_Java技术栈的博客-CSDN博客 子类型 ...

  5. Java多态-如何理解父类引用指向子类对象

    java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是"向上转型". 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过   C ...

  6. 什么是Java多态?如何实现Java多态?

    java多态这个概念在同学们深入学习java的时候就会被提出,很多同学并不知道是什么意思,如何实现.今天小千就来给大家介绍一下什么是java多态和java如何实现多态. 什么是多态? 指允许不同类的对 ...

  7. Java学习笔记二十六:Java多态中的引用类型转换

    Java多态中的引用类型转换 引用类型转换: 1.向上类型转换(隐式/自动类型转换),是小类型到大类型的转换: 2.向下类型转换(强制类型转换),是大类型到小类型的转换: 3.instanceof运算 ...

  8. Java 多态、抽象类 笔记

    1. Java 多态 多态就是同一个接口,使用不同的实例而执行不同操作. 1.1 多态存在的三个必要条件 继承 重写 父类引用指向子类对象(Parent p = new Child();) 当使用多态 ...

  9. 经典java程序员的面试题及答案

    今天动力节点java培训机构小编为大家分享"经典java程序员的面试题及答案",希望通过此文能够帮助到正在找工作或是即将毕业的"你",下面就随小编一起看看经典j ...

最新文章

  1. SpringMVC拦截器简单使用
  2. Web请求响应简单整理
  3. 备份CSDN博客正文到本地存档
  4. Linux 入门基础
  5. android开发4:Android布局管理器1(线性布局,相对布局RelativeLayout-案例)
  6. java月份列表_java – 如何获取两个日期之间的月份和年份列表
  7. count 有条件 mysql_【笔记】Mysql中使用count加条件统计
  8. 中立时滞matlab,中立型时滞系统的稳定性改进判据
  9. linux IP、端口连通性测试
  10. Maven详解(转)
  11. WebStrom Sass 编译配置 windows
  12. dubbo学习总结——思维导图
  13. python斐波那契数列函数,python—函数进阶-斐波那契数列
  14. 某大型银行深化系统技术方案之十四:服务层之服务调度机制
  15. 就你赚的那点钱,我们家哪里有能力请护工?
  16. 一张有转折意义的神秘地图
  17. 双层pdf软件free_这款软件神器,让你读文献的效率翻一倍!(文末有福利哦)...
  18. 手机坏点如何测试软件,怎么检测手机屏幕坏点
  19. EFCore对数据库增删改查
  20. 交换机的作用是什么?交换机功能及工作原理详解!

热门文章

  1. 面试题java存储过程_java中级面试题的考点
  2. window查看服务器占用内存,windows资源管理器占用内存大
  3. js循环添加事件的两种方法
  4. Mybatis Plus 多租户方案
  5. Cookie和Session的区别(面试必备)
  6. 【论文阅读】WMH Segmentation Challenge 2017 及第一名解决方案
  7. eMMC5.1入门教程【1】eMMC简介与协议概览
  8. tnsping命令解析
  9. 【刷题】求出一定范围内的素数
  10. JavaScript中的IIFE