通过代码实例深入解析Java重写和重载

 更新时间:2020年11月03日 15:07:41   作者:Hollis  
这篇文章主要介绍了通过代码实例深入解析Java重写和重载,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

重载(Overloading)和重写(Overriding)是Java中两个比较重要的概念。但是对于新手来说也比较容易混淆。本文通过两个简单的例子说明了他们之间的区别。

定义

重载

简单说,就是函数或者方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。

重写

重写指的是在Java的子类与父类中有两个名称、参数列表都相同的方法的情况。由于他们具有相同的方法签名,所以子类中的新方法将覆盖父类中原有的方法。

重载 VS 重写

关于重载和重写,你应该知道以下几点:

1、重载是一个编译期概念、重写是一个运行期间概念。

2、重载遵循所谓“编译期绑定”,即在编译时根据参数变量的类型判断应该调用哪个方法。

3、重写遵循所谓“运行期绑定”,即在运行的时候,根据引用变量所指向的实际对象的类型来调用方法

4、因为在编译期已经确定调用哪个方法,所以重载并不是多态。而重写是多态。重载只是一种语言特性,是一种语法规则,与多态无关,与面向对象也无关。(注:严格来说,重载是编译时多态,即静态多态。但是,Java中提到的多态,在不特别说明的情况下都指动态多态)

重写的例子

下面是一个重写的例子,看完代码之后不妨猜测一下输出结果:

class Dog{
  public void bark(){
    System.out.println("woof ");
  }
}
class Hound extends Dog{
  public void sniff(){
    System.out.println("sniff ");
  }

  public void bark(){
    System.out.println("bowl");
  }
}

public class OverridingTest{
  public static void main(String [] args){
    Dog dog = new Hound();
    dog.bark();
  }
}

输出结果:

bowl

上面的例子中,dog对象被定义为Dog类型。在编译期,编译器会检查Dog类中是否有可访问的bark()方法,只要其中包含bark()方法,那么就可以编译通过。在运行期,Hound对象被new出来,并赋值给dog变量,这时,JVM是明确的知道dog变量指向的其实是Hound对象的引用。所以,当dog调用bark()方法的时候,就会调用Hound类中定义的bark()方法。这就是所谓的动态多态性。

重写的条件

参数列表必须完全与被重写方法的相同;

返回类型必须完全与被重写方法的返回类型相同;

访问级别的限制性一定不能比被重写方法的强;

访问级别的限制性可以比被重写方法的弱;

重写方法一定不能抛出新的检查异常或比被重写的方法声明的检查异常更广泛的检查异常

重写的方法能够抛出更少或更有限的异常(也就是说,被重写的方法声明了异常,但重写的方法可以什么也不声明)

不能重写被标示为final的方法;

如果不能继承一个方法,则不能重写这个方法。

重载的例子

class Dog{
  public void bark(){
    System.out.println("woof ");
  }

  //overloading method
  public void bark(int num){
    for(int i=0; i<num; i++)
      System.out.println("woof ");
  }
}

上面的代码中,定义了两个bark方法,一个是没有参数的bark方法,另外一个是包含一个int类型参数的bark方法。在编译期,编译期可以根据方法签名(方法名和参数情况)情况确定哪个方法被调用。

重载的条件

被重载的方法必须改变参数列表;

被重载的方法可以改变返回类型;

被重载的方法可以改变访问修饰符;

被重载的方法可以声明新的或更广的检查异常;

方法能够在同一个类中或者在一个子类中被重载。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Spring 中优雅的获取泛型信息的方法

    Spring 中优雅的获取泛型信息的方法

    这篇文章主要介绍了Spring 中优雅的获取泛型信息的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • 一分钟入门Java Spring Boot彻底解决SSM配置问题

    一分钟入门Java Spring Boot彻底解决SSM配置问题

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域成为领导者
    2021-10-10
  • Java AES256加密解密示例代码

    Java AES256加密解密示例代码

    这篇文章主要介绍了Java AES256加密解密示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • 详解Spring AOP 拦截器的基本实现

    详解Spring AOP 拦截器的基本实现

    本篇文章主要介绍了详解Spring AOP 拦截器的基本实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Java中jqGrid 学习笔记整理——进阶篇(二)

    Java中jqGrid 学习笔记整理——进阶篇(二)

    这篇文章主要介绍了Java中jqGrid 学习笔记整理——进阶篇(二)的相关资料,需要的朋友可以参考下
    2016-04-04
  • java编程小白进阶包的作用详解

    java编程小白进阶包的作用详解

    这篇文章主要为大家介绍了java编程中包的作用详解,文中通过示例分析方便大家更容易理解包的作用,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-10-10
  • 详解Java如何应对常见的安全威胁和攻击类型

    详解Java如何应对常见的安全威胁和攻击类型

    随着信息技术的快速发展,网络安全问题日益突出,本文将以Java开发语言为例,深入探讨网络协议的安全性问题,通过分析常见的安全威胁和攻击类型,设计和实施安全协议等主题,为读者提供一些有益的思路和方法,需要的朋友可以参考下
    2023-11-11
  • Java设计模式之备忘录模式实现对象状态的保存和恢复

    Java设计模式之备忘录模式实现对象状态的保存和恢复

    本文介绍Java设计模式之备忘录模式,该模式可以实现对象状态的保存和恢复。通过详细讲解备忘录模式的原理、实现方法和应用场景,帮助读者深入理解该设计模式,并提供示例代码和技巧,便于读者实际应用
    2023-04-04
  • spring data jpa开启批量插入、批量更新的问题解析

    spring data jpa开启批量插入、批量更新的问题解析

    这篇文章主要介绍了spring data jpa开启批量插入、批量更新问题,本文通过图文实例相结合给大家介绍的非常详细,需要的朋友可以参考下
    2021-07-07
  • Java设计模式之单一职责原则精解

    Java设计模式之单一职责原则精解

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。本篇介绍设计模式七大原则之一的单一职责原则
    2022-02-02

最新评论