首页 > 其他分享 >简单谈谈方法重载和方法重写(编译时多态和运行时多态)

简单谈谈方法重载和方法重写(编译时多态和运行时多态)

时间:2024-09-07 17:46:59浏览次数:11  
标签:重写 void 多态 Shape 重载 方法 public

这篇文章来聊一聊方法重载和重写到底是有什么区别,重载实现的是编译时多态,而方法重写实现的是运行时多态,那什么又是编译时多态和运行时多态呢?

定义一个Animal类,

public class Animal {

    public void say(int age){
        System.out.println("我的年龄是" + age);
    }

    public void say(int age, int weight){
        System.out.println("我的年龄是" + age + ", 体重是" + weight);
    }

    public void say(String name){
        System.out.println("我的姓名是" + name);
    }
}

这边写了3个say方法,同名方法为什么可以同时存在,这边就要说到重载的机制了。对方法而言只要参数列表不同,那么就可以定义为同名方法,在编译时编译器会判断要调用的到底是哪一个方法,这也就是编译时多态。参数列表是什么?参数列表就是方法括号后面那一串,只要参数个数或者类型不同,那么就可以实现重载。注意:参数列表和返回类型没有任何关系,哪怕返回类型是int,String或者其他类型,都不能改变参数列表,这边是个容易理解错的地方。

下面情况不属于方法重载,而且编译无法通过,会直接报错

public class ParamsList {
    public String display(String temp){
        return "ABC";
    }

    public int display(String temp){
        return 1024;
    }
}

换个角度想想:你上面的方法传一个String,下面的传的也是String,谁知道你要干嘛
?谁知道你要调哪个方法?

所以改变返回类型是无法实现重载的,所以它也不属于参数列表的一部分。

测试一下刚才的Animal例子,

public class OverTest {
    public static void main(String[] args) {
        Animal animal = new Animal();
        animal.say(18);
        animal.say(24, 50);
        animal.say("john");
    }
}

得到的结果如下

我的年龄是18
我的年龄是24, 体重是50
我的姓名是john

可以看到方法的确都被正确的调用了,这边就是实现方法重载的办法。

那么方法重写呢?又是怎么回事,下面定义一个图形Shape类,包含圆形Circle和长方形Rectangle。圆形和长方形明显是图形的子类,图形是抽象的,是一个概念,而圆形和长方形是具体的,有具体的规则约定。

Shape

public class Shape {
    
    public void run(){
        System.out.println("这是一个图形");
    }
}

Circle

public class Circle extends Shape{

    @Override
    public void run() {
        System.out.println("这是一个圆形");
    }
}

Rectangle

public class Rectangle extends Shape{

    @Override
    public void run() {
        System.out.println("这是一个长方形");
    }
}

Circle和Rectangle继承了Shape类,并定义了run方法,子类定义了和父类同名并且参数相同的方法,这种行为就叫做方法重写。在运行时会根据对象来判断是需要调用哪一个方法,下面测试一下。

public class OverTest {
    public static void main(String[] args) {
        Shape shape = new Shape();
        Shape circle = new Circle();
        Shape rectangle = new Rectangle();

        start(shape);
        start(circle);
        start(rectangle);
    }

    public static void start(Shape shape){
        shape.run();
    }
}

start方法会根据我们运行时创建的对象来判断,到底调用哪一个run方法。测试结果如下

这是一个图形
这是一个圆形
这是一个长方形

可以看到run方法都被正确调用,这就是实现运行时多态的流程。

方法重写和方法重载有什么用呢?

方法重载可以避免方法名因为不能冲突而思考怎么定义一大堆同名方法的问题,更加便捷,同时也提升了代码可读性,简化代码。

方法重写提高了代码的可扩展性,例如图形其实是一个抽象的概念,可以把塔延伸为具体的图形,比如圆形,长方形,但不止于此,还有三角形,多边形... 例如在传参时,可以把类型定义为Shape类,那么调用的时候Shape本身和所有继承自Shape的类都可以传入,并自动识别需要调用的run方法。

标签:重写,void,多态,Shape,重载,方法,public
From: https://www.cnblogs.com/huajieyu/p/18401970

相关文章

  • 【Java 基础】:三大特征之多态
    ✨                         杏花疏影里,吹笛到天明    ......
  • java多态的编译执行
    多态执行“编译看左边,运行看右边”“成员变量,静态方法看左边;非静态方法:编译看左边,运行看右边。”意思是:当父类变量引用子类对象时(Fuf=newZi();),在这个引用变量f指向的对象中,他的成员变量和静态方法与父类是一致的,他的非静态方法,在编译时是与父类一致的,运行时却与子类......
  • Python中的方法重写与多态:解锁编程的无限可能
    在编程的世界里,灵活性与扩展性往往是衡量一个语言是否强大、易于维护的关键指标。Python,作为一种被广泛使用的高级编程语言,不仅以其简洁易读的语法赢得了众多开发者的喜爱,更因其支持多种面向对象特性而备受青睐。其中,“方法重写”与“多态”便是两个核心概念,它们不仅能够极......
  • Python中的方法重写与多态:解锁编程的无限可能
    在编程的世界里,灵活性与扩展性往往是衡量一个语言是否强大、易于维护的关键指标。Python,作为一种被广泛使用的高级编程语言,不仅以其简洁易读的语法赢得了众多开发者的喜爱,更因其支持多种面向对象特性而备受青睐。其中,“方法重写”与“多态”便是两个核心概念,它们不仅能够极大地提高......
  • 11-6类的多态和多态性
    多态指的是一类事物有多种形态,比如动物有多种形态:猫、狗、猪classAnimal:#同一类事物:动物deftalk(self):passclassCat(Animal):#动物的形态之一:猫deftalk(self):print('喵喵喵')classDog(Animal):#动物的形态之二:狗deftalk(self)......
  • 什么是重载、重写、隐藏?
    目录前言1.重载(Overloading)2.重写(Overriding)3.隐藏(Hiding)前言在面向对象编程中,重载、重写和隐藏是三种不同的概念,通常用于方法或函数的定义。它们的主要区别在于应用的场景、规则,以及发生的时间点。重载(Overloading):在同一个作用域中,多个同名函数,参数列表不同,返回类......
  • 《C++中的面向对象编程三大特性:封装、继承与多态》
    在C++编程的广阔世界中,面向对象编程(Object-OrientedProgramming,OOP)的三大特性——封装、继承和多态,犹如三把强大的利器,帮助程序员构建出高效、可维护和可扩展的软件系统。本文将深入探讨如何在C++中实现这三大特性,并通过具体的代码示例展示它们的强大之处。一、封装(Enca......
  • 深度解析C++中函数重载与引用
    ......
  • Java中多态的学习
    多态目录多态多态的概念为什么要使用多态多态存在的三个必要条件多态的实现方式多态的分类方式一方式二多态的机制原理多态的概念多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作。为什么要使用多态消除类型之间的耦......
  • 网站提示“Apache/Nginx配置错误:如虚拟主机配置错误、重写规则错误等”错误如何解决
    当您遇到“Apache/Nginx配置错误”,如虚拟主机配置错误、重写规则错误等问题时,这通常意味着您的Web服务器配置文件中存在一些问题,导致服务无法正常工作或某些功能无法正常使用。以下是一些解决这类问题的方法:Apache配置错误1.检查虚拟主机配置定位配置文件:Apache的虚拟主机......