Java中的多态究竟是什么?

这篇具有很好参考价值的文章主要介绍了Java中的多态究竟是什么?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.概念

多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态

Java中的多态究竟是什么?,java,python,开发语言

二.使用条件

1.必须是在继承情况下
2.子类方法必须重写
3.需由父类调用

```java
class Animal{
    public String name;
    public int age;
    public Animal(String name,int age){
        this.name = name;
        this.age = age;
    }
    public void eat(){
        System.out.println(this.name+"正在吃饭");
//        return null;
    }
}
class Dog extends Animal{
    public Dog(String name,int age){
        super(name,age);
    }
    public String color;
    public void eat(){
        System.out.println(super.name+"正在吃狗粮");
//        return null;
    }
}
class Cat extends Animal{
    public Cat(String name,int age){
        super(name,age);
    }
    public String hair;
    public void eat(){
        System.out.println(super.name+"正在吃猫粮");
    }
}
public class test {
    public static void main(String[] args) {
        Animal animal = new Dog("小黄狗",1);
        animal.eat();

        Animal animal1 = new Cat("小白猫",1);
        animal1.eat();

    }
}

Java中的多态究竟是什么?,java,python,开发语言
Java中的多态究竟是什么?,java,python,开发语言

三.重写

1.概念

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

2.使用条件

1.被final修饰的方法,不能被重写,这个方法叫做密封方法。
2.被static修饰方法,不能被重写。
3.子类重写方法时,子类方法的访问修饰限定符要大于等于父类方法的权限。
4.被private修饰的方法,不能被重写。因为被修饰说明是私有的,只能在当前类中使用。
5.重写方法返回值可以不相同(返回值类型构成父子类关系)

3.与重载对比

区别点 重写(override) 重载(overload)
参数列表 一定不能修改 可以修改
返回类型 一定不能修改(除非可以构成父子关系) 可以修改
访问限定符 限制只能降低不能提高 可以修改

Java中的多态究竟是什么?,java,python,开发语言

参数列表是指参数的个数,位置,类型。
返回类型
Java中的多态究竟是什么?,java,python,开发语言
访问限定符
Java中的多态究竟是什么?,java,python,开发语言

4.举例

Java中的多态究竟是什么?,java,python,开发语言

5.为什么需要重写

现在的科技发展飞速,产品迭代速度也非常快,在几年前我们的手机很多功能没有实现,以汽车的暖气来说,多年前可能只有车内显示屏暖气开关的功能,而现在增加了实时温度显示,有的车上并没有感温器,那我们在编写程序时,难道还需要对那些车上没有感温器装置的系统编写温度显示功能吗?这显然不现实。
Java中的多态究竟是什么?,java,python,开发语言
Java中的多态究竟是什么?,java,python,开发语言

1.重写规则

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

2.静态绑定–重载

重载就是一种静态绑定->编译期间绑定的
静态绑定在编译时,根据用户传参就可以确定调用的方法

3.动态绑定–重写

重写:用@Override修饰(编译器自动添加)

动态绑定在编译时并不能确定调用哪一个方法,只有当运行时才能确定。

四.向上转型

第一种传参方式:直接赋值

向上转型就是将子类对象赋给父类
语法格式:父类类型 对象名 = new 子类类型()

Animal animal = new Dog("小黄狗",1);
class Animal{
    public int age;
    public String name;
    public Animal(String name,int age){
        this.name = name;
        this.age = age;
    }
    public void eat(){
        System.out.println(this.name+"宝宝正在吃饭");
    }
}
class Dog extends Animal{
    public Dog(String name,int age){
        super(name,age);
    }
    public String color;
    public void barks(){
        System.out.println(this.name+"汪汪汪");
    }
}
public class Test {
    public static void main(String[] args) {
        Dog dog = new Dog("小黄",1);
        Animal animal = dog;
        //这里就是向上转型
             Animal animal = new Dog("小黄",1);
    }
}

而向上转型后,还是只能访问自己特有的方法
发生重写(父类和子类拥有同样的方法)此时,就调用子类的。这叫做动态绑定

第二种传参方式:通过传参

Java中的多态究竟是什么?,java,python,开发语言
Java中的多态究竟是什么?,java,python,开发语言
这里同一个引用调用了同一个方法,引用不同对象,有不同的情况。就叫做多态。

优缺点

向上转型的优点:让代码实现更简单灵活。
向上转型的缺陷:不能调用到子类特有的方法。(只有重写时,才能访问)。

五.向下转型

举例

class Animal{
    public String name;
    public int age;
    public Animal(String name,int age){
        this.name = name;
        this.age = age;
    }
    public void eat(){
        System.out.println(this.name+"正在吃饭");
//        return null;
    }
}
class Bird extends Animal{
    public int high;
    public  Bird(String name,int age){
        super(name,age);
    }
    public void fly(){
        System.out.println(super.name+"正在飞");
    }
}

用Animal调用子类飞的方法,编译错误,因为该方法是子类特有的,没有发生重写。此时向下转型应用而生。
Java中的多态究竟是什么?,java,python,开发语言
向下转型强制类型转换
Java中的多态究竟是什么?,java,python,开发语言
向下转型并不安全

缺点

Java中的多态究竟是什么?,java,python,开发语言

六.多态的优缺点

优点

1.能够降低代码的 “圈复杂度”, 避免使用大量的 if - else
2. 可扩展能力更强
在下面的代码中可以体现

class ShowShape{
    public void draw(){
        System.out.println("打印图像!");
    }
}
class Cycle extends ShowShape{
    public void draw(){
        System.out.println("圆形⚪");
    }
}
class Square extends ShowShape{
    public void draw(){
        System.out.println("正方形");
    }
}

不使用多态

public class Test {
    public static void func(ShowShape showShape){
        showShape.draw();
    }
    public static void main(String[] args) {
        Cycle cycle = new Cycle();
        Square square = new Square();
        String[] shapes = {"cycle", "square"};
        for (String shape : shapes) {
            if (shape.equals("cycle")) {
                cycle.draw();
            } else if (shape.equals("square")) {
                square.draw();
            }
        }
    }
}

如果使用多态,代码完全可以不用如此复杂。

 public static void main(String[] args) {
        Cycle cycle = new Cycle();
        Square square = new Square();
        ShowShape[] shapes = {cycle,square};
        for (ShowShape showShape:shapes) {
            showShape.draw();
        }
    }
}

第二个优点体现
如果要新增一种新的形状, 使用多态的方式代码改动成本也比较低.

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

对于类的调用者来说(drawShapes方法), 只要创建一个新类的实例就可以了, 改动成本很低.
而对于不用多态的情况, 就要把 drawShapes 中的 if - else 进行一定的修改, 改动成本更高.

缺点

多态缺陷:代码的运行效率降低。

  1. 属性没有多态性
    当父类和子类都有同名属性的时候,通过父类引用,只能引用父类自己的成员属性
  2. 构造方法没有多态性

码字不易,感谢观看
如果对你有帮助的话,记得点赞👍评论+关注吧文章来源地址https://www.toymoban.com/news/detail-754745.html

到了这里,关于Java中的多态究竟是什么?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何理解Java中的多态?

    多态的概念比较简单,就是同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。 如果按照这个概念来定义的话,那么多态应该是一种运行期的状态。为了实现运行期的多态,或者说是动态绑定,需要满足三个条件: 有类继承或者接口实现。 子类要重写父

    2024年02月14日
    浏览(33)
  • Java中的多态如何理解——详解

    🎈🎈🎈本篇文章我们主要讲解的是Java中的多态,那么什么是多态呢? 同类型的对象,执行同一个行为,会表现出不同的行为特征。 接下来让我们一起对多态进行详细地讲解。   多态的常见形式: 父类类型 对象名称 = new 子类构造器; 接口 对象名称 = new 实现类构造器;

    2023年04月12日
    浏览(36)
  • 年度语言之--c#与java的多态

    引言 多态是面向对象编程中的一个核心概念,它赋予语言更强大的表达力和灵活性。 Java和C#作为广泛使用的两中面向对象编程语言,多态这一特性都起到重要的作用,但它们实现这一概念的方式存在着一些差异。 本文将讨论Java与C#在实现多态方面的不同。 我们将分析这两种

    2024年02月22日
    浏览(40)
  • IDP中的黄金路径究竟是什么?

    在云原生时代,开发人员面临着越来越多的工具、技术、思维方式的选择,给他们带来了极大的认知负担和工作量。为了提高开发人员的开发效率与开发体验,一些头部科技公司开始建立自己的内部开发者平台(IDP)。在之前的文章我们有简单了解过 IDP 相关的基础概念。I

    2024年02月02日
    浏览(37)
  • 编程开发8大语言详解,为什么Java是我最推荐的?

    很多没有接触过编程语言的同学,都会觉得编程开发特别高端和神奇,担心理解不了更担心学不会。 当然,也有人会认为,你既然是做编程的,那么你应该什么都会,什么软件的开发都能完成,这是平哥经常听到的两种声音。 在此,平哥需要给大家科普一下, 编程确实改变

    2024年02月05日
    浏览(73)
  • 关于java中的多态和对实例化对象的一些理解

    java面向对象三大特征即为:继承封装多态。而多态需要三大必要条件。分别是:继承、方法重写、父类引用指向子类对象。我们先一个一个来理解。 1、首先是继承和重写。这个很简单。因为多态就是建立在不同的重写之上的。也就是说多态就是在使用着一个方法的不同重写

    2024年02月02日
    浏览(39)
  • java中的线程不安全和实例解析,网络安全多态实现原理

    先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7 深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前! 因此收集整理了一份《2024年最新网络安全全套学习资料》

    2024年04月27日
    浏览(44)
  • 【从JVM看Java,三问继承和多态,是什么?为什么?怎么做?深度剖析JVM的工作原理】

    《计算机底层原理专栏》:欢迎大家订阅学习,能够帮助到各位就是对我最大的鼓励! 文章目录 系列文章目录 前言 一、JVM是什么 二、 什么是继承 三、 什么是多态 总结         这篇文章聚焦JVM的实现原理,我更专注于从一个语言的底层原理,去剖析他的语法所实现的意义

    2024年02月05日
    浏览(55)
  • 关于java中的多态和对实例化对象以及向上、向下转型的一些理解

    java面向对象三大特征即为:继承封装多态。而多态需要三大必要条件。分别是:继承、方法重写、父类引用指向子类对象。我们先一个一个来理解。 1、首先是继承和重写。这个很简单。因为多态就是建立在不同的重写之上的。也就是说多态就是在使用着一个方法的不同重写

    2024年02月02日
    浏览(44)
  • 简单易懂的理解java开发中的 DO、BO、DTO、VO、AO都是什么✌

    这些只是开发的规范,规范就是建议遵守的,大家都这样做,长期以来就形成了一种开发规范,便于我们开发。 DO、BO、DTO、VO、AO他们都是普 通的Java类 ,只不过通常我们把他们放在DO、BO、DTO、VO、AO名的包下,结尾以DO、BO、DTO、VO、AO命名放在这些包下的类。 有时DO也会放在

    2024年02月01日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包