zoukankan      html  css  js  c++  java
  • java的重写

    如果子类中具有与父类中声明相同的方法,在java中称为方法覆盖。换句话说,如果子类提供了由其父类提供的其中一个方法的特定实现,则它被称为方法覆盖。所以方法覆盖有两个前提条件:继承和子父类中方法名称相同。

    Java方法覆盖的用法

    • 方法重写用于提供有别于超类提供的方法的特定实现。
    • 方法重写用于运行时多态性。

    Java方法覆盖的规则

    1. 方法必须与父类中的名称相同。
    2. 方法必须具有与父类中相同的参数。
    3. 必须是IS-A关系(继承)。

    理解没有方法覆盖的问题

    下面让我们来了解如果在程序中不使用方法覆盖可能面临的问题。

    class Vehicle {
        void run() {
            System.out.println("Vehicle is running");
        }
    }
    
    class Bike extends Vehicle {
    
        public static void main(String args[]) {
            Bike obj = new Bike();
            obj.run();
        }
    }
    
    Java

    执行上面代码,输出结果如下 -

    Vehicle is running
    
    Java

    问题是,必须在子类中提供一个run()方法,这就是为什么要使用方法覆盖。

    方法覆盖的示例

    在下面的这个例子中,在父类中和子类中都定义了run方法,但子类中有一些特定的实现。 方法的名称和参数是相同的,并且类之间有IS-A关系,因此这里run方法被覆盖了。

    class Vehicle {
        void run() {
            System.out.println("Vehicle is running");
        }
    }
    
    class Bike2 extends Vehicle {
        void run() {
            System.out.println("Bike is running safely");
        }
    
        public static void main(String args[]) {
            Bike2 obj = new Bike2();
            obj.run();
        }
    }
    
    Java

    执行输出结果如下 -

    Bike is running safely
    
    Java

    Java方法重写的实例

    考虑下面一个真实应用的情况,Bank是一个提供获取利率的功能的类。 但是,利息率因银行不同而有所区别。 例如,SBIICICIAXIS银行可以提供8%7%9%的利率。

    class Bank {
        int getRateOfInterest() {
            return 0;
        }
    }
    
    class SBI extends Bank {
        int getRateOfInterest() {
            return 8;
        }
    }
    
    class ICICI extends Bank {
        int getRateOfInterest() {
            return 7;
        }
    }
    
    class AXIS extends Bank {
        int getRateOfInterest() {
            return 9;
        }
    }
    
    class Test2 {
        public static void main(String args[]) {
            SBI s = new SBI();
            ICICI i = new ICICI();
            AXIS a = new AXIS();
            System.out.println("SBI Rate of Interest: " + s.getRateOfInterest());
            System.out.println("ICICI Rate of Interest: " + i.getRateOfInterest());
            System.out.println("AXIS Rate of Interest: " + a.getRateOfInterest());
        }
    }
    
    Java

    执行输出结果如下 -

    SBI Rate of Interest: 8
    ICICI Rate of Interest: 7
    AXIS Rate of Interest: 9
    
    Java

    问题:可以覆盖静态方法吗?

    答: 这是不可以的,静态方法不能被覆盖。可以通过运行时多态来证明不能覆盖,在稍后章节中将学习它。

    问题: 为什么不能覆盖静态方法?
    答: 因为静态方法是绑定类,而实例方法绑定对象。 静态属于类区域,实例属于堆区域。

    问题:可以重写java main方法吗?

    答: 这是不可以的,因为main是一个静态方法。

    java方法重载和方法重写之间的区别:

        • 方法重载和覆盖的区别 
        • java中的方法重载和方法重写有很多区别。 下面给出了方法重载和方法覆盖之间的差异列表:
    编号方法重载方法重写
    1 方法重载用于提高程序的可读性。 方法重写用于提供已经由其超类提供的方法的特定实现。
    2 方法重载在类内执行。 方法重写发生在具有IS-A(继承)关系的两个类中。
    3 在方法重载的情况下,参数必须不同。 在方法重写的情况下,参数必须相同。
    4 方法重载是编译时多态性的例子。 方法重写/覆盖是运行时多态性的例子。
    5 在java中,方法重载不能仅通过改变方法的返回类型来执行。方法重载中的返回类型可以相同或不同。 但是必须更改参数类型。 在方法重写/覆盖中返回类型必须相同或协变。

    Java方法重载示例

    class OverloadingExample {
        static int add(int a, int b) {
            return a + b;
        }
    
        static int add(int a, int b, int c) {
            return a + b + c;
        }
    }
    
    Java

    Java方法覆盖示例

    class Animal {
        void eat() {
            System.out.println("eating...");
        }
    }
    
    class Dog extends Animal {
        void eat() {
            System.out.println("eating bread...");
        }
    }
    
  • 相关阅读:
    Java遍历Map键、值。获取Map大小的方法
    Oracle CASE WHEN 用法介绍
    JS动态改变select选择变更option的index值
    js对select动态添加和删除OPTION
    在js中使用createElement创建HTML对象和元素
    清空select标签中option选项的3种不同方式
    json-lib包笔记
    异常:javax.el.PropertyNotFoundException: Property 'id' not found on ..........
    golang struct的使用
    golang多维数组的切片
  • 原文地址:https://www.cnblogs.com/yumo1627129/p/7170570.html
Copyright © 2011-2022 走看看