java三大特性之多态

华为防火墙 策略路由实现多ISP接入Internet PC3上网访问Server1时走ISP1。PC4上网访问Server1时走ISP2。1、配置接口IP并加入相应的安全区域。二、ISP2 运营商 R2路由器。一、ISP1 运营商 R1路由器。 阅读详情

多态的定义

多态
程序中定义的引用变量和通过该引用变量调用的方法所指向的具体类型和具体类型的方法在编程时并不确定,而只有在程序运行期间某一刻才能具体确定的情况称之为多态。

写的有点饶,但是可以看到几个重点是引用的变量和该变量的方法在没运行时我们是不确定它的具体类型的。

那么为什么会有这种情况呢,根据在继承中的提现我们发现会发生这种情况的就是向下转型的问题。
即;我们可以确定猫是动物,但是反过来如果别人给你是一只被袋子装起来的动物(向上转型)你是无法判断它到底是猫还是小老虎(向下转型)不是么。

多态的三个必要条件

因此多态出现的情况就很明显了,它必须有一个前提场景才能发生;

实现多态有三个必要条件:继承(extent)、重写(overriding)、向上转型

通过实例说明

public class Animal {
    public void fun1(){
        System.out.println("Animal 的Fun.....");
        fun2();
    }

    public void fun2(){
        System.out.println("Animal 的Fun2...");
    }
}
public class Cat  extends Animal{
    /**
     * @desc 子类重载父类方法
     *        父类中不存在该方法,向上转型后,父类是不能引用该方法的
     * @param a
     * @return void
     */
    public void fun1(String a){
        System.out.println("Cat 的 Fun1...");
        fun2();
    }

    /**
     * 子类重写父类方法
     * 指向子类的父类引用调用fun2时,必定是调用该方法
     */
    public void fun2(){
        System.out.println("Cat 的Fun2...");
    }



    public static void main(String[] args) {
        Animal a = new Cat();
        a.fun1();
    }

}

Output

Animal 的Fun.....
Cat 的Fun2...

从程序的运行结果中我们发现,
a.fun1()首先是运行父类Animal中的fun1().然后再运行子类Cat中的fun2()。

所以对于多态我们可以总结如下:

指向子类的父类引用由于向上转型了,它只能访问父类中拥有的方法和属性,而对于子类中存在而父类中不存在的方法,该引用是不能使用的,尽管是重载该方法。若子类重写了父类中的某些方法,在调用这些方法的时候,必定是使用子类中定义的这些方法(动态连接、动态调用)。

多态的表现形式

java中的多态的表现形式一般分为两种:overriding(重写)和overloading(重载)

  • 重写overriding是父类和子类之间多态性的一种表现
  • 重载overloading是一个类中多态性的表现。

如果在子类中定义某方法与其父类有相同的名称和参数,我们就可以这样说此方法被子类重写overriding,子类中的对象使用这个方法的时候,将调用子类中中的定义,此时对子类来说,父类中的方法定义如同被”屏蔽”了一样(a不能调用fun1(String str)方法)。如果在一个类中定义了多个同名的方法,它们或有不同的参数或有不同的参数类型,则称为方法的重载overloading。并且overloading的方式是可以改变返回值类型的,但是父类中并没有这些重载的方法。

多态的种类

  • 分为编译时多态和运行时多态

多态的实现方式

两种实现方式:
- 基于继承
- 基于接口

基于继承实现的多态

上面的例子都是基于继承实现的,当然下面这个也是基于继承:

public class Wine {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Wine(){
    }

    public String drink(){
        return "喝的是 " + getName();
    }

    /**
     * 重写toString()
     */
    public String toString(){
        return null;
    }
}

public class JNC extends Wine{
    public JNC(){
        setName("JNC");
    }

    /**
     * 重写父类方法,实现多态
     */
    public String drink(){
        return "喝的是 " + getName();
    }

    /**
     * 重写toString()
     */
    public String toString(){
        return "Wine : " + getName();
    }
}

public class JGJ extends Wine{
    public JGJ(){
        setName("JGJ");
    }

    /**
     * 重写父类方法,实现多态
     */
    public String drink(){
        return "喝的是 " + getName();
    }

    /**
     * 重写toString()
     */
    public String toString(){
        return "Wine : " + getName();
    }
}

public class Test {
    public static void main(String[] args) {
        //定义父类数组
        Wine[] wines = new Wine[2];
        //定义两个子类
        JNC jnc = new JNC();
        JGJ jgj = new JGJ();

        //父类引用子类对象
        wines[0] = jnc;
        wines[1] = jgj;

        for(int i = 0 ; i < 2 ; i++){
            System.out.println(wines[i].toString() + "--" + wines[i].drink());
        }
        System.out.println("-------------------------------");

    }
}

OUTPUT:

Wine : JNC--喝的是 JNC
Wine : JGJ--喝的是 JGJ
-------------------------------

在上面的代码中JNC、JGJ继承Wine,并且重写了drink()、toString()方法,程序运行结果是调用子类中方法,输出JNC、JGJ的名称,这就是多态的表现。不同的对象可以执行相同的行为,但是他们都需要通过自己的实现方式来执行,这就要得益于向上转型了。

  我们都知道所有的类都继承自超类Object,toString()方法也是Object中方法,当我们这样写时:
Object o = new JGJ();

      System.out.println(o.toString());

所以基于继承实现的多态可以总结如下:对于引用子类的父类类型,在处理该引用时,它适用于继承该父类的所有子类,子类对象的不同,对方法的实现也就不同,执行相同动作产生的行为也就不同。

基于接口实现的多态

  继承是通过重写父类的同一方法的几个不同子类来体现的,那么就可就是通过实现接口并覆盖接口中同一方法的几不同的类体现的。

  在接口的多态中,指向接口的引用必须是指定这实现了该接口的一个类的实例程序,在运行时,根据对象引用的实际类型来执行对应的方法。

  继承都是单继承,只能为一组相关的类提供一致的服务接口。但是接口可以是多继承多实现,它能够利用一组相关或者不相关的接口进行组合与扩充,能够对外提供一致的服务接口。所以它相对于继承来说有更好的灵活性。

这里就不写代码了,接口继承,执行的方法根据具体的子类型来确定,借口本身是不能直接调用的,所以执行的具体方法根据传递的子类型来执行它的实现方法。

经典案例

这是一个非常变态的多态案例,作者写得非常详细:

http://blog.youkuaiyun.com/thinkGhoster/archive/2008/04/19/2307001.aspx

public class A {
    public String show(D obj) {
        return ("A and D");
    }

    public String show(A obj) {
        return ("A and A");
    } 

}

public class B extends A{
    public String show(B obj){
        return ("B and B");
    }

    public String show(A obj){
        return ("B and A");
    } 
}

public class C extends B{

}

public class D extends B{

}

public 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));      
    }
}

答案

          ①   A and A
          ②   A and A
          ③   A and D
          ④   B and A
          ⑤   B and A
          ⑥   A and D
          ⑦   B and B
          ⑧   B and B
          ⑨   A and D

分析

    ①②③比较好理解,一般不会出错。④⑤就有点糊涂了,为什么输出的不是"B and B”呢?!!先来回顾一下多态性。

    运行时多态性是面向对象程序设计代码重用的一个最强大机制,动态性的概念也可以被说成“一个接口,多个方法”。Java实现运行时多态性的基础是动态方法调度,它是一种在运行时而不是在编译期调用重载方法的机制。

    方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。

当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。 (但是如果强制把超类转换成子类的话,就可以调用子类中新添加而超类没有的方法了。)

    好了,先温习到这里,言归正传!

多层父子调用的优先级

上面的案例实际上涉及方法调用的优先问题

优先级由高到低依次为:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。让我们来看看它是怎么工作的。

    比如④,a2.show(b),a2是一个引用变量,类型为A,则this为a2,b是B的一个实例,于是它到类A里面找show(B obj)方法,没有找到,于是到A的super(超类)找,而A没有超类,因此转到第三优先级this.show((super)O),this仍然是a2,这里O为B,(super)O即(super)B即A,因此它到类A里面找show(A obj)的方法,类A有这个方法,但是由于a2引用的是类B的一个对象,B覆盖了A的show(A obj)方法,因此最终锁定到类B的show(A obj),输出为"B and A”。
搞定ESD(二):ESD干扰机理分析 大家好,我是记得诚。上文介绍了ESD的基本知识,对ESD的测试标准进行了解析,包括静电发生器的介绍,实验布置要求,静电放电实验的实施及判定等内容。本文主要介绍ESD的干扰机理。 阅读详情

相关推荐

RK3588S开发板实战:手把手教你调试IMX415摄像头(附常见问题排查)

本文提供了基于RK3588S开发板调试IMX415摄像头的完整实战指南。从硬件连接到软件配置,详细解析了设备树(DTS)设置、驱动加载验证及V4L2工具链使用,并附带了常见问题排查方法,帮助开发者快速解决摄像头调试中的典型问题,实现图像采集与性能调优。

assembly8low的博客 590

探索Java中的多态

多态是指同一个方法在不同对象上具有不同的行为。通过多态,程序可以在运行时决定调用哪个方法,从而提高代码的灵活性和可扩展性。多态是Java中一个重要且强大的特性,它允许在运行时根据对象的实际类型调用相应的方法,从而提高代码的灵活性和可扩展性。通过方法重载、方法重写、接口和抽象类,可以实现多态,并在实际开发中广泛应用于代码复用、接口回调和工厂模式等场景。希望本文能帮助您更好地理解和应用Java中的多态。如果您有任何问题或建议,欢迎留言讨论。

梦想家星空的博客 914

opencode 完全指南:终端AI编程助手的安装、模型配置与实战

在AI编程助手快速迭代的当下,开发者对终端环境下的自动化编码需求愈发强烈。以自然语言驱动代码修改、命令执行与测试验证,已成为提升工程效率的重要方向。这类工具普遍遵循模型无关的设计原则,通过兼容OpenAI格式的接口接入多种大模型,并借助多会话管理、Skills、Memory等机制实现可审查、可干预的闭环流程。从安装配置到日常使用,再到apihub网关与免费模型的接入,终端AI助手在代码审查、跨文件重构、浏览器自动化验证等场景中展现出独特价值。本文聚焦opencode这一开源CLI工具,详细拆解其核心定位、模

weixin_33868027的博客 417

【Java】多态的含义、多态的作用及多态的详细代码实现

1.多态的含义 什么是多态,就是一个事物有多种形态,比如说是老师是老师,他也是人,也是丈夫或者妻子,或者光棍儿,这就阐述了多种形态。

m0_64210833的博客 6133

基于Android13的系统启动流程分析(三)之FirstStageMain阶段

init进程是Android系统中用户空间的第一个进程,作为第一个进程,它被赋予了很多极其重要的工作职责,比如创建zygote(孵化器)和属性服务等。init进程是由多个源文件共同组成的,这些文件位于源码目录system/core/init1. Bootloader 引导当按下设备电源键时,最先运行的就是 bootloader(固化在ROM的程序),bootloader 的主要作用就是硬件设备(如 CPU、flash、内存)的初始化并加载到RAM,通过建立内存空间映射,为装载 Linux 内核做好准备,。

q1210249579的博客 5496

ubuntu20.04下内核源码下载分析

ubuntu 20.04下内核源代码下载,配置编译环境写在前面一、安装VMware Workstation和Ubuntu20.04二、修改apt源合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 写在前面 我最近的科研工作需要使用到对ubun

冰冻三尺非一日之寒 1万+

超详细带你了解Java中的多态

1.多态 文章目录1.多态多态概述虚函数重写多态的实现方式方式一:重写:方法的重写规则方式二:接口方式三:抽象类和抽象方法4.多态的转型6. instanceof关键字 多态概述 简单概述:同一个对象,在不同时刻表现出来的不同形态 多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。 因为在程序运行时才确定具体的类,

鱼干的博客 4243

AI安全护栏评测:TrustedExecBench如何量化评估大模型防护能力

在人工智能和机器学习领域,模型安全对齐是确保AI系统可靠、可控的核心技术。其原理是通过设计安全机制(即“护栏”)来约束模型行为,防止生成有害、偏见或越界内容。这项技术的核心价值在于平衡AI能力与风险管控,是可信AI部署的基石。应用场景广泛覆盖内容审核、对话系统、代码生成等需要人机交互的领域。本文聚焦的TrustedExecBench项目,正是针对“护栏”性能量化评估这一痛点,提供了一个标准化、自动化的开源评测框架。该工具通过构建多维度的恶意测试套件,并引入基于模型的动态评判机制,能够系统性地检验大语言模型在

weixin_42525428的博客 378

Java·一篇文章搞懂多态

父类引用指向子类对象时,通过该引用调用 “被子类重写的方法”,实际执行的是子类的实现,而非父类的实现。用简单的方式说就是:“一个引用,多种形态”—— 引用的类型是父类,但指向的对象是子类,调用方法时会 “适配” 子类的具体行为。优先用接口而非抽象类:接口更灵活(支持多实现),能拆分职责(如SoundableFlyable),避免父类职责过重;父类 / 接口只定义 “通用规范”:不包含子类特有的逻辑,避免限制子类扩展;减少向下转型。

Porunarufu的博客 1107

《网络安全自学教程》- OSI七层模型分层及作用,数据封装与解封过程,数据传输过程。

OSI分哪七层,每层的作用是什么,解释数据在七层模型中是怎样传输的,封包和解封过程,数据包在每一层是怎么封装和解封的。

wangyuxiang946的博客 1万+

今日指数项目之实时流数据采集【六】

实时数据采集代码

Maynor的博客 2146

Java多态

简单来说,就是 "一个接口,多种实现"。比如生活中的 "支付" 行为:用支付宝支付、微信支付、银行卡支付,核心都是 "支付",但具体流程不同 —— 这就是多态的现实映射。System.out.println("银行卡支付" + amount + "元,已扣除手续费0.1%");System.out.println("支付宝支付" + amount + "元,已享受红包优惠");System.out.println("微信支付" + amount + "元,已抵扣零钱通收益");

2503_93322206的博客 562

2020年大连理工大学《单片机原理及应用》期末试卷

2020年大连理工大学《单片机原理及应用》期末试卷 此试卷为大连理工大学2020年《单片机原理及应用》期末试卷; 大连理工大学2020年《单片机原理及应用》期末试卷; 大连理工大学2020年《单片机原理及应用》期末试卷。 ...

无名何许人的博客 1478

理解java三大特性之多态

java提高篇(四)-----理解java的三大特性之多态

L668303的博客 227

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Java三大特性之多态

多态是Java的三大特性之一,它指的是同一个方法名字,在不同的对象中有不同的实现方式。具体来说,多态有两种表现形式:静态多态(编译时多态,也称为重载)和动态多态(运行时多态,也称为重写)。这些不同的实现方式可以让我们通过一个统一的接口来操作不同的对象,从而提高程序的灵活性和可扩展性。多态的好处是可以在不改变原有代码的情况下,增加新的功能,提高代码的可维护性和可扩展性。通过多态,我们可以使用一个统一的接口来操作不同的对象,降低代码的耦合度,提高代码的复用度和可读性。静态多态是通过方法重载来实现的。

m0_66130067的博客 418

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Java 三大特性之多态

介绍多态以及其中涉及的重写、向上转型、向下转型、instanceof、动态绑定、静态绑定等

2301_82302966的博客 1294

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Java 三大特性 —— 多态

Java中多态性的实现   一、什么是多态 1.面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。这是我们最后一个概念,也是最重要的知识点。 2.多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用) 3.实现多态的技术称为:动态绑定(dynamic binding),是指

知秋一叶 3971

Java 三大特性—多态

这是因为 Animal 类是 Dog 类和 Cat 类的基类,基类可以引用不同子类的对象,因此传递给形参 animal的值会出现不同,当传递的是 Dog 类的对象时,会调用 Dog 类中的方法,当传递的是 Cat 类的对象时,会调用 Cat 类中的方法。由上述结果可知,由于 animal 实际指向的是 Dog 类的对象,因此执行第二个 if 语句块,将 animal 强转为 Dog 类型对象,此时就可以调用 Dog 类中新增的成员方法。多态的体现:在代码运行时,当传递不同类的对象时,会调用对应类中的方法。

2401_87463146的博客 1038

java三大特性-多态

Java中的多态,是面向对象编程的三大特性之一,继封装和继承之后。具体来说,多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定。这意味着一个引用变量最终会指向哪个类的实例对象,以及该引用变量发出的方法调用到底是哪个类中实现的方法,都必须在程序运行时才能决定。这种机制允许不同类型的对象对同一方法进行不同的实现,从而实现了同一个行为具有多个不同表现形式或形态的能力。例如,狗和猫都是动物,它们都有吃的行为,但是狗可以啃骨头,猫则可以咀嚼鱼。

miaoyl的博客 773

Java 三大特性之-多态

Java 三大特性之-多态 对于java的学习差不多也有一年多时间,而从一开始学习便了解的三大特性: 继承 封装 多态 到了现在逐渐开始有了新的认识,本篇文章就简单的聊一下多态。 了解多态之前,我们先大致了解一下继承和封装的作用 [ ] 继承: 继承不仅是对于对象关系的一种体现,对于客户端程序员来说,继承更是一种对代码复用性的一种体现。 [ ] 封装 : 讲到封装就得讲到面向对象之...

周日王的博客 198

java三大特性之【多态】

对于不同的打印机对象,使用相同的打印方法,表现出不同的行为。,其他(方法名称、参数列表、返回值类型(向上转型除外))完全相同的方法称为子类重写了父类的方法。反之,如果指向的不是子类对象,则无法向下转型,抛出类型转换异常ClassCaseException。同样的一个方法/行为,经过不同的对象,表现出不同的行为,这样的现象就称为多态。父类引用本身就指向的是子类对象,向下转型才能还原为当前这个子类引用;不同的对象,调用相同的方法,表现出不同的行为,称为多态!,与返回值无关的一组方法,称为重载方法。

qq_43475751的博客 1268

java中的多态特性_JAVA三大特性之三——多态

作为JAVA的三大特性之一,多态性是很多人都没有弄清楚的一个重要特性,今天我就来从我所理解的角度来说一下。首先,从他的字面意思来理解,多态,从其字面来理解就是多种形态,多种表现形式。根据这些,我最能想到的例子就是图形,图形是个很大的类,他包含三角形、矩形、圆、梯形、五边形等等,而他们都属于图形类,表现的形式各有特点,属性、方法都不同。所以,我所理解的第一点就是多态指的是子类相对于父类的不同表现形式...

weixin_42361175的博客 793
上一篇: finally在try和catch块以及return中的执行顺序
下一篇: FastDFS单机配置
牧竹子
博客等级 码龄17年 572粉丝 233原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值