zoukankan      html  css  js  c++  java
  • Java-重载和重写区别剖析

      重载(Overload)和重写(Override)是任何一门面向对象的语言都会具有的两个特性,自然,Java语言中也具有此两种特性。但是,对于Java新手,或者没有面向对象语言经验的开发者而言,这会是两个容易混淆和迷糊的特性。本文将由浅入深,以示例代码的方式详解此两种特性的区别。

    定义

      重载是指一个类中具有两个或者两个以上,具有相同方法名和不同参数的方法。

      重写是指两个具有相同方法名和相同参数的方法(方法签名),其中一个方法在父类中,另一个却存在于子类中。重写的机制使得对于父类中已经提供的方法,子类可以提供实现了特定逻辑的同名同参方法来屏蔽它。

    重载 VS 重写

      关于重载与重写,我们需要知道的重点有:

    1. 对于两个 重写 的方法而言,JVM会在 运行时 根据对象的实际Class类型,而不是引用该对象的变量的Class类型,来决定实际调用哪个重写的方法。同时,对于多个 重载 的方法而言,Java编译器会在 编译时 根据引用该对象的变量的Class类型,来决定调用哪个重载的方法。
    2. 面向对象语言的三大特性之一的 多态 就是依赖于重写机制。
    3. 重写方法在运行时做判断;重载方法在编译时做判断。

    重写

      首先,我们看一个关于重写的例子。

     1 class Dog {
     2 public void bark() {
     3 System.out.println(“www.tiantianbianma.com”);
     4 }
     5 }
     6 class Hound extends Dog {
     7 public void sniff() {
     8 System.out.println(“好好学习”);
     9 }
    10 public void bark() {
    11 System.out.println(“天天编码”);
    12 }
    13 }
    14 public class OverrideTest {
    15 public static void main(String[] args) {
    16 Dog dog = new Hound();
    17 dog.bark();
    18 }
    19 }

    建议读者仔细思考得出答案后,再实际上机验证答案。正确的答案是:天天编码

    上述代码中,这个 dog 变量被声明为 Dog 类型。在代码编译时,Java编译器检查 Dog 类型是否具有 bark() 方法。因为 Dog 类是具有 bark() 方法的,所以代码能正确编译。在代码运行时,一个 Hound 类型的对象被创建,并将其引用赋值给了 dog 变量,JVM知道 dog 变量是引用到了一个 Hound 类型的对象,所以真正调用的是 Hound 类的 bark() 方法。这也就是 多态 机制的原理。

    重载

    首先,我们还是看一个关于重载的代码示例:

     1 class Dog {
     2 public void bark() {
     3 System.out.println(“www.tiantianbianma.com”);
     4 }
     5 public void bark(int num) {
     6 for (int i = 0; i < num; i++) {
     7 System.out.println(“天天编码”);
     8 }
     9 }
    10 }

    在这个示例代码中,通过使用不同的调用参数,Dog 类的两个 bark 方法都可以被调用。在编译时,编译器就可以根据参数的类型或者个数等信息区分出它们,从而决定实际该调用哪个方法。

    参考资料:http://www.tiantianbianma.com/java-overload-override.html/

  • 相关阅读:
    HNOI2014
    HNOI2018
    HNOI2015
    HNOI2016
    Luogu4099 HEOI2013 SAO 组合、树形DP
    CF915G Coprime Arrays 莫比乌斯反演、差分、前缀和
    CF1110H Modest Substrings AC自动机、DP
    CF1110E Magic Stones 差分
    CentOS 7 配置OpenCL环境(安装NVIDIA cuda sdk、Cmake、Eclipse CDT)
    LeetCode(134) Gas Station
  • 原文地址:https://www.cnblogs.com/lemaden/p/10141375.html
Copyright © 2011-2022 走看看