多态polymorphism:方法或者对象具有多种形态

方法的多态

  1. 方法的重载可以体现多态

代码示例

  1. // 通过方法重载,展现同一种方法的不同形态
  2. public class PolyMethod {
  3. public static void main(String[] args) {
  4. AA aa = new AA();
  5. aa.f();
  6. aa.f(1);
  7. aa.f(1, 2);
  8. }
  9. }
  10. class AA {
  11. public void f() {
  12. System.out.println("f()");
  13. }
  14. public void f(int i) {
  15. System.out.println("f(i)");
  16. }
  17. public void f(int i, int j) {
  18. System.out.println("f(i,j)");
  19. }
  20. }
  1. 方法的重写可以体现多态

代码示例

  1. // 通过子类继承父类并重写父类中的方法,体现同一个方法的不同形态
  2. public class PolyMethod02 {
  3. public static void main(String[] args) {
  4. BB bb = new BB();
  5. bb.f();
  6. BBB bbb = new BBB();
  7. bbb.f();
  8. }
  9. }
  10. class BB {
  11. public void f() {
  12. System.out.println("BB f()");
  13. }
  14. }
  15. class BBB extends BB {
  16. @Override
  17. public void f() {
  18. System.out.println("BBB f()");
  19. }
  20. }

对象的多态

  1. 对象的编译类型与运行类型可以不同
  2. 对象的编译类型在定义对象的时候就确定了不能更改
  3. 对象的运行类型可以改变
  4. 对象的编译类型看创建对象时=的左边,运行类型看=的右边
    • Animal animal = new Dog();
    • animal = new Cat();

代码示例

  1. public class PolyObject {
  2. public static void main(String[] args) {
  3. People people = new Student();
  4. //people编译类型为People,运行类型为Student
  5. //System.out.println(people.id);
  6. //people.f2();
  7. System.out.println("name=" + people.name);
  8. System.out.println(people.show());
  9. }
  10. }
  11. class People {
  12. String name = "jack";
  13. int age = 18;
  14. public void f1() {
  15. System.out.println("People f1()");
  16. }
  17. public String show() {
  18. return "name=" + name + ",age=" + age;
  19. }
  20. }
  21. class Student extends People {
  22. int id = 1;
  23. double score = 100;
  24. @Override
  25. public String show() {
  26. return super.show() + ",id=" + id + ",score=" + score;
  27. }
  28. public void f2() {
  29. System.out.println("Student f2()");
  30. }
  31. }

多态的注意事项和细节

  1. 使用父类对象引用可以调用父类中的所有成员(遵守访问权限)
  2. 使用父类对象引用不能调用子类的特有成员(编译阶段,只能按编译类型访问)
  3. 最终的运行效果,看运行类型
  4. !!!属性没有多态之说,属性的值直接看编译类型
  5. instanceof比较操作符,用于判断对象的运行类型是否为XX类型或者XX类型的子类型

代码示例

  1. public class PolyDetail02 {
  2. public static void main(String[] args) {
  3. A a = new B();
  4. System.out.println(a.count);
  5. //System.out.println(a.x);
  6. }
  7. }
  8. class A{
  9. int count = 10;
  10. }
  11. class B extends A{
  12. int count = 20;
  13. int x = 100;
  14. }

代码示例

  1. public class PolyDetail03 {
  2. public static void main(String[] args) {
  3. C c = new D();
  4. System.out.println(c instanceof C);
  5. System.out.println(c instanceof D);
  6. System.out.println(c instanceof Object);
  7. D d = new D();
  8. System.out.println(d instanceof C);
  9. System.out.println(d instanceof D);
  10. C cc = new C();
  11. System.out.println(cc instanceof C);
  12. System.out.println(cc instanceof D);
  13. }
  14. }
  15. class C {}
  16. class D extends C {}

向下转型

  1. 语法:子类类型 变量=(子类类型)父类引用;
  2. 只能强转父类的引用,而不能强转父类的对象
  3. 要求父类的引用必须指向当前目标类型的对象
  4. 当向下转型后,可以调用子类类型中所有的成员

Java动态绑定机制

  1. 当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定
  2. 当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用

代码示例

  1. public class DynamicBinding {
  2. public static void main(String[] args) {
  3. A a = new B();
  4. System.out.println(a.sum());
  5. System.out.println(a.sum1());
  6. }
  7. }
  8. class A {
  9. public int i = 10;
  10. public int sum() {
  11. return getI() + 10;
  12. }
  13. public int sum1() {
  14. return i + 10;
  15. }
  16. public int getI() {
  17. return i;
  18. }
  19. }
  20. class B extends A {
  21. public int i = 20;
  22. @Override
  23. public int sum() {
  24. return getI() + 20;
  25. }
  26. @Override
  27. public int sum1() {
  28. return i + 10;
  29. }
  30. @Override
  31. public int getI() {
  32. return i;
  33. }
  34. }

20220727-Java中多态总结的更多相关文章

  1. 关于java中多态的理解

    java三大特性:封装,继承,多态. 多态是java的非常重要的一个特性: 那么问题来了:什么是多态呢? 定义:指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行 ...

  2. 深入Java核心 Java中多态的实现机制(1)

    在疯狂java中,多态是这样解释的: 多态:相同类型的变量,调用同一个方法时,呈现出多中不同的行为特征, 这就是多态. 加上下面的解释:(多态四小类:强制的,重载的,参数的和包含的) 同时, 还用人这 ...

  3. 个人对Java中多态的一些简单理解

    什么是多态 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对象对同一消息做出响应.即同一 ...

  4. Java中多态的一些简单理解

    什么是多态 .面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. .多态的定义:指允许不同类的对象对同一消息做出响应.即 ...

  5. 从虚拟机指令执行的角度分析JAVA中多态的实现原理

    从虚拟机指令执行的角度分析JAVA中多态的实现原理 前几天突然被一个"家伙"问了几个问题,其中一个是:JAVA中的多态的实现原理是什么? 我一想,这肯定不是从语法的角度来阐释多态吧 ...

  6. Java 中多态的实现(下)

    Java 中多态的另一个语法实现是重写.重载是通过静态分派实现的,重写则是通过动态分派实现的. 在学习动态分派之前,需要对虚拟机的知识有一个初步的了解. 虚拟机运行时数据区 运行 Java 程序时,虚 ...

  7. Java 中多态的实现(上)

    Java 中语法上实现多态的方式分为两种:1. 重载.2. 重写,重载又称之为编译时的多态,重写则是运行时的多态. 那么底层究竟时如何实现多态的呢,通过阅读『深入理解 Java 虚拟机』这本书(后文所 ...

  8. Java中多态、抽象类和接口

    1:final关键字(掌握) (1)是最终的意思,可以修饰类,方法,变量. (2)特点: A:它修饰的类,不能被继承. B:它修饰的方法,不能被重写. C:它修饰的变量,是一个常量. (3)面试相关: ...

  9. Java中多态的理解

    最近学习Java里面的多态下面是个人的整理: 多态存在的3个必要条件: 1.要有继承 2.要有方法的重写 3.父类引用指向子类对象(对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会 ...

  10. 对Java中多态,封装,继承的认识(重要)

                                                            一.Java面向对象编程有三大特性:封装,继承,多态 在了解多态之前我觉得应该先了解一下 ...

随机推荐

  1. Docker容器(container)详解 (转载自http://c.biancheng.net/view/3150.html)

  2. while和for循环的补充与数据类型的内置方法(int, float, str)

    目录 while与for循环的补充 while + else 死循环 while的嵌套 for补充 range函数 break与continue与else for循环的嵌套 数据类型的内置方法 int ...

  3. Android 子线程 UI 操作真的不可以?

    作者:vivo 互联网大前端团队- Zhang Xichen 一.背景及问题 某 SDK 有 PopupWindow 弹窗及动效,由于业务场景要求,对于 App 而言,SDK 的弹窗弹出时机具有随机性 ...

  4. NBMiner42.1版本发布,完全解锁30系LHR版本显卡

    2021年下半年,NVIDIA发布了LHR版本显卡,对显卡算力进行了限制. 2022年5月8日,NBMiner发布NBMiner_41.0版本,在最新的内核中加入了100%LHR解锁器,适用于Wind ...

  5. 二叉树遍历在Unity中的实现

    前言:今天放一天,想到要放国庆假了就心烦气躁,躺床上又焦虑,回想起面试官的一副扑克脸,马上跳起来看了看数据结构. 今天复习了二叉树,包括一些基本概念和特性,当看到二叉树遍历的章节时,马上联想到了Uni ...

  6. Python <算法思想集结>之抽丝剥茧聊动态规划

    1. 概述 动态规划算法应用非常之广泛. 对于算法学习者而言,不跨过动态规划这道门,不算真正了解算法. 初接触动态规划者,理解其思想精髓会存在一定的难度,本文将通过一个案例,抽丝剥茧般和大家聊聊动态规 ...

  7. salesforce零基础学习(一百一十五)记一个有趣的bug

    本篇参考:https://help.salesforce.com/s/articleView?language=en_US&type=1&id=000319486 page layou ...

  8. vue组件传参的方法--bus事件总线

    定义:事件总线是实现vue任意组件之前传递参数的一种编程技巧,本质上就是组件的自定义事件.事件总线有很多种写法,具体的思路就是创造一个大家都可以访问到的公共的属性,在这个公共的属性上面可以调用$on, ...

  9. [自制操作系统] 第05回 CPU的三种模式

    目录 一.前景回顾 二.实模式和保护模式 一.前景回顾 在之前我们说到,loader的作用才是读取加载操作系统内核,那么我们的重心就应该是loader.S文件,其实我们接下来也的确是会往loader. ...

  10. BUUCTF-假如给我三天光明

    假如给我三天光明 打开压缩包可以看到一个海报,下方有盲文显示,通过对照表得知 盲文翻译为kmdonowg 通过盲文翻译得到的字符串解压压缩包得到一个音频文件 使用Audacity打开,看样子应该是摩斯 ...