我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java-多态

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java-多态

目录

1.多态的概念

2.多态的实现条件。

3.重写

4.向上转型和向下转型

5.多态的优缺点

6.避免在构造方法中调用重写方法


        多态字面意思就是多种形态,具体点就是完成某个行为时,不同的对象完成时产生不同的状态。

         总之,同一件事情,发生在不同的对象身上,会有不同的结果

        在java中要实现多态,必须要满足如下几个条件,缺一不可:

                1. 继承关系上:向上转型

                2. 子类有和父类同名的重写方法

                3.  通过父类对象的引用,调用重写的方法

       完成以上三个条件,就会发生动态绑定,动态绑定是多态的基础。

        多态的体现:在代码运行时,传递不同类对象时,会调用对应类中的重写方法。

class Animals{

    public String name;

    public int age;

    public Animals(String name,int age){

        this.name=name;

        this.age=age;

 }

    public void eat(){

        System.out.println(this.name+"正在吃饭");

    }

}

class Dogs extends Animals{

    public Dogs(String name, int age){

        super(name,age);

    }

    public void bark(){

        System.out.println(this.name+"正在汪汪叫~");

    }

    //方法重写

    @Override  //注解

    public void eat() {

        System.out.println(this.name+"正在吃狗粮");

    }

}

class Cats extends Animals{

    public Cats(String name, int age){

        super(name,age);

    }

    public  void mimi(){

        System.out.println(this.name+"正在喵喵叫~");

    }

    //方法重写

    @Override  //注解

    public void eat() {

        System.out.println(this.name+"正在吃猫粮");

    }

}

public class Text {

        public static void main(String[] args) {

        //animal这个引用 指向了Dogs类的对象,向上转型直接赋值

        Animals animal=new Dogs("赛虎",10);

        animal.eat();//父类的eat

        System.out.println("====");

        //animal这个引用 指向了Cats类的对象,向上转型直接赋值

        Animals animal1=new Cats("菲菲",15);

        animal1.eat();

    }

}

与上述代码中向上转型方式不同,但原理相同。

        重写(override):也称为覆盖。重写是子类对父类非静态、非private修饰,非final修饰,非构造方法等的实现过程进行重新编写, 返回值和形参都不能改变即外壳不变,核心重写!重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。

public void eat(){
    System.out.println(this.name+"正在吃饭");
}

public void eat() {
    System.out.println(this.name+"正在吃狗粮");
}
public void eat() {
    System.out.println(this.name+"正在吃猫粮");
}


        重写规则

        1.一般最基本的:返回值、参数列表、方法名必须一样

        2.被重写的方法的访问修饰限定符在子类中要大于等于在父类中的,即访问权限不能比父类中被重写的方法的访问权限更低,例如如果父类方法被public修饰,则子类中重写该方法就不能声明为 protected。

        3.父类被static、private,final修饰的方法、构造方法都不能被重写。

        4.重写的方法, 可以使用 @Override 注解来显式指定. 有了这个注解能帮我们进行一些合法性校验。

         方法重载(overloading)是一个类的多态性表现,而方法重写(overriding)是子类与父类的一种多态性表现。

         重写设计原则:对于已经投入使用的类,尽量不要进行修改。最好的方式是:重新定义一个新的类,来重复利用其中共性的内容,并且添加或者改动新的内容

        例如:几十年前的手机,只能打电话,发短信,来电显示只能显示号码,而今天的手机在来电显示的时候,不仅仅可以显示号码,还可以显示头像,地区等。在这个过程当中,我们不应该在原来老的类上进行修改,因为原来的类,可能还在有用户使用,正确做法是:新建一个新手机的类,对来电显示这个方法重写就好了,这样就达到了我们当今的需求了。
        静态绑定:也称为前期绑定(早绑定),即在编译时,根据用户所传递实参类型就确定了具体调用那个方法。典型代表方法重载。
        动态绑定:也称为后期绑定(晚绑定),即在编译时,不能确定方法的行为,需要等到程序运行时,才能够确定具体调用那个类的方法

        

       1. 向上转型:实际就是创建一个子类对象,将其当成父类对象来使用。
        语法格式:父类类型 对象名=new 子类类型()

        Animal animal=new Dogs(“赛虎”,10);

         animal是父类类型,但可以引用一个子类对象,因为是从小范围向大范围的转换。

        向上转型方法:1直接赋值2.方法的参数,传参时向上赋值3.返回值向上转型。

        1.直接赋值

Animal animal=new Dogs(“赛虎”,10);

        2.方法的参数,传参时向上转型

//方法的参数,传参的时候向上转型
public static void func1(Animals animal) {
    
}
public static void main2(String[] args) {
    Dogs dog=new Dogs("赛虎",10);
    func1(dog);
}

         3.返回值向上转型

        //3.返回值 向上转型
public static Animals main3(String[] args){
    Dogs dog=new Dogs("赛虎",10);
    return dog;
}

         向上转型的优点:让代码实现更简单灵活,,缺点:不能调用到子类特有的方法
        2. 向下转型:将一个子类对象经过向上转型之后当成父类方法使用,再无法调用子类的方法,但有时候可能需要调用子类特有的方法,此时:将父类引用再还原为子类对象即可
 

 Java中为了提高向下转型的安全性,引入了 instanceof ,如果该表达式为true,则可以安全转换。

public class Text {

        public static void main(String[] args) {

        //animal这个引用 指向了Dogs类的对象,向上转型直接赋值

        Animals animal=new Dogs("赛虎",10);

        animal.eat();//父类的eat

        System.out.println("====");

        //animal这个引用 指向了Cats类的对象,向上转型直接赋值

        animal=new Cats("菲菲",15);

        animal1.eat();

        //表示如果引用animal指向对象类型确实为Dogs对象实例

        if(animal instanceof Dogs){

                dog=(Dog)animal;

        }

        //表示如果引用animal指向对象类型确实为Cat对象实例

        if(animal instanceof Dogs){

                cat=(Cat)animal;

        }

    }

}

        若有以下代码

class Shape{    public void drow(){        System.out.println("画一个图案");    }}//矩形class Rect extends Shape{    @Override    public void drow() {        System.out.println("矩形!~~~");    }}//圆形class Cycle extends Shape{    @Override    public void drow() {        System.out.println("圆形⚪!~~~");    }}//花形class Flower extends Shape{    @Override    public void drow() {        System.out.println("花形❀!~~~");    }}

        使用多态的好处:

            1.能够降低代码的 "圈复杂度", 避免使用大量的 if - else。

                圈复杂度是一种描述一段代码复杂程度的方式. 一段代码如果平铺直叙, 那么就比较简单容易理解. 而如果有很多的条件分支或者循环语句, 就认为理解起来更复杂,我们可以简单粗暴的计算一段代码中条件语句和循环语句出现的个数, 这个个数就称为 "圈复杂度"。如果一个方法的圈复杂度太高, 就需要考虑重构。

        现在我们需要打印多个形状:

        不基于多态实现方法

public class Textshape {

        public static void main(String[] args) {

                Cycle cycle=new Cycle();

                Rect rect=new Rect();

                Flower flower=new Flower();

                String[] shapes={"cycle","rect","flower"}

                for(Sting shape:shapes){

                        if(shape.equals(''cycle")){

                                cycle.drow();

                        }

                       else if(shape.equals(''rect")){

                                rect.drow();

                        }

                        else if(shape.equals(''flower")){

                                flower.drow();

                        }

                }

}

        基于多态的实现方法

public class Textshape {    public static void funshape(Shape shape){        shape.drow();    }    public static void main(String[] args) {                        //创建了Shape对象的数组        Shape[] shapes={new Cycle(),new Rect(),new Flower()}        for(Shape x:shapes){                shape.drow();        }    }}

         2.可扩展能力强

        如果要新增一种新的形状, 使用多态的方式代码改动成本也比较低。

class Triangle extends Shape {
        @Override
        public void draw() {
        System.out.println("△");
        }
}

        多态缺陷:代码的运行效率降低
        1.属性没有多态性。当父类和子类都有同名属性的时候,通过父类引用,只能引用父类自己的成员属性。
        2.构造方法没有多态性。

        一段有坑的代码,创建两个类, B 是父类, D 是子类. D 中重写 func 方法. 并且在 B 的构造方法中调用 func。

class B{

        public B(){

                func();

        }

        public void func(){

                System.out.println("B.func()");

        }

}

class D extends B{

        private int num=1;

        @Override
        public void func() {
                System.out.println("D.func() " + num);
        }

}

public class Text {    public static void main(String[] args) {        D d = new D();    }}

        构造 D 对象的同时, 会调用 B 的构造方法;B 的构造方法中调用了 func 方法, 此时会触发动态绑定, 会调用到 D 中的 func此时 D 对象自身还没有构造, 此时 num 处在未初始化的状态, 值为 0; 如果具备多态性,num的值应该是1;所以在构造函数内,尽量避免使用实例方法,除了final和private方法。
 

来源地址:https://blog.csdn.net/qq_64668629/article/details/132074949

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java-多态

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

2023-08-31

Java之多态

多态 多态的实现条件重写重写的定义重写的例子方法重写的条件 多态思想动态绑定与静态绑定 作者简介: zoro-1,目前大一,正在学习Java,数据结构等 作者主页:zoro-1的主页 欢迎大家点赞 👍
2023-08-16

java多态是什么

多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作,如图所示: (推荐学习:java课程)多态性是对象多种表现形式的体现。现实中,比如我们按下 F1 键这个动作:如果当前在 Flash 界面下弹出的就是 AS
java多态是什么
2015-05-12

java 多态是什么

多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作,如图所示:多态性是对象多种表现形式的体现。现实中,比如我们按下 F1 键这个动作:·如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;·如果当前在
java 多态是什么
2020-09-04

如何在 Java 中实现多态性?(java如何实现多态性)

在Java编程中,多态性是一个非常重要的概念,它允许对象根据其所属的类或实现的接口而表现出不同的行为。实现多态性有多种方式,以下是详细的介绍。一、方法重载(Overloading)方法重载是在同一个类中定义多个具有相同名称但
如何在 Java 中实现多态性?(java如何实现多态性)
Java2024-12-15

java 多态实例代码

多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作。多态性是对象多种表现形式的体现,比如:在现实中,我们按下F1键这个动作:如果当前在Flash界面下弹出的就是AS 3的帮助文档如果当前在Wo
2023-05-30

java如何实现多态

Java多态概述:(推荐:java视频教程)多态是面向对象编程语言的重要特性,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定。Java 对于方法调用动态绑定的实现主要依赖于方法表,但通过类引用调用(invokevitual)和接口引用
java如何实现多态
2020-07-13

java多态怎么理解

这篇文章主要介绍java多态怎么理解,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在java中,多态是同一个行为具有多个不同表现形式或形态的能力;多态就是同一个接口,使用不同的实例而执行不同操作。多态的优点:1、消除
2023-06-14

如何理解 Java Construct 的继承和多态?(Java Construct的继承和多态)

在Java编程中,JavaConstruct的继承和多态是两个非常重要的概念,它们对于构建复杂的面向对象程序起着关键作用。一、继承(Inheritance)继承是面向对象编程的三大特性之一,它允许
如何理解 Java Construct 的继承和多态?(Java Construct的继承和多态)
Java2024-12-22

Java多态性怎么理解

本篇内容主要讲解“Java多态性怎么理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java多态性怎么理解”吧!面向对象编程有三个特征,即封装、继承和多态。封装隐藏了类的内部实现机制,从而可以
2023-06-17

Java中的继承与多态

在这篇文章中,我们探讨了Java中的继承和多态,这是面向对象编程的两个基本概念。通过使用extends关键字、方法重写和接口,我们可以创建更多可重用的、可扩展的和模块化的代码。理解这些概念不仅可以帮助你成为一个更好的Java开发者,还可以提

java面向对象之多态

多态的简单理解:student类继承了Person类,则student类的对象既是student又是person类多态性具有两种展现的形式:1.方法的多态性:(1)方法的重载:同一个方法可以根据传入的参数的类型或者个数的不同实现不同的功能(2)方法的覆写:同一
java面向对象之多态
2019-03-28

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录