Java方法重写(方法覆盖)

1 什么是Java方法覆盖

如果子类具有与父类中声明的方法相同的方法,则在Java中被称为方法重写(或方法覆盖)

换句话说,如果子类提供其父类已声明的方法的特定实现,则称为方法重写(或方法覆盖)

2 Java方法覆盖的用法

  • 方法覆盖用于提供其父类已经提供的方法的特定实现。
  • 方法覆盖用于运行时多态

3 Java方法覆盖的规则

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

4 理解为什么需要Java方法重载

让我们了解一下,如果不使用方法覆盖,在程序中可能会遇到什么问题。

/**
 * 一点教程网 - http://www.yiidian.com
 */
//通过示例讲解为什么需要Java方法覆盖
//创建父类
class Vehicle{
    void run(){
        System.out.println("车辆在跑...");
    }
}
//创建子类
class Bike extends Vehicle{
    public static void main(String args[]){
        //创建子类的对象
        Bike obj = new Bike();
        //用子类对象调用方法
        obj.run();
    }
}

输出结果为:

车辆在跑...

现在问题是:我希望调用run() 方法是子类的方法,这时就需要使用方法覆盖啦。

5 Java方法重载的示例

在下面示例中,我们在子类中定义了run方法,并且提供了具体的实现逻辑。方法的名称和参数相同,并且类之间存在IS-A关系,因此存在方法覆盖。

/**
 * 一点教程网 - http://www.yiidian.com
 */
//通过示例讲解Java方法覆盖的使用
//创建父类
class Vehicle{
    //父类定义run方法
    void run(){
        System.out.println("车辆在跑...");
    }
}
//创建子类
class Bike2 extends Vehicle{
    //子类也定义了run方法,这样就对父类的run方法形成了方法覆盖
    void run(){
        System.out.println("自行车在跑...");
    }

    public static void main(String args[]){
        Bike2 obj = new Bike2();//创建子类对象
        obj.run();//调用方法
    }
}

输出结果为:

自行车在跑...

6 Java方法重载的实际案例

有这么一个场景,其中Bank是提供获取利率的功能的类。但是,利率因银行而异。例如,ICBC,CCB,HSBC银行可以提供8%,7%和9%的利率。

/**
 * 一点教程网 - http://www.yiidian.com
 */
//Java方法覆盖的实际案例
//后面三个银行类覆盖了Bank类的方法
//创建父类
class Bank{
    int getRateOfInterest(){
        return 0;
    }
}
//创建子类
class ICBC extends Bank{
    int getRateOfInterest(){
        return 8;
    }
}

class CCB extends Bank{
    int getRateOfInterest(){
        return 7;
    }
}
class HSBC extends Bank{
    int getRateOfInterest(){
        return 9;
    }
}
//测试类,分别使用子类对象调用方法
class Test2{
    public static void main(String args[]){
        ICBC s=new ICBC();
        CCB i=new CCB();
        HSBC a=new HSBC();
        System.out.println("ICBC贷款利率为: "+s.getRateOfInterest());
        System.out.println("CCB贷款利率为: "+i.getRateOfInterest());
        System.out.println("HSBC贷款利率为: "+a.getRateOfInterest());
    }
}

输出结果为:

ICBC贷款利率为: 8
CCB贷款利率为: 7
HSBC贷款利率为: 9

7 Java方法覆盖的常见问题

7.1 可以覆盖静态方法吗

不可以,静态方法不能被覆盖。可以通过运行时多态来证明,后面章节学习。

7.2 为什么不能覆盖静态方法

这是因为静态方法与类绑定,而实例方法与对象绑定。静态属于类区域,实例属于堆区域。

7.3 可以覆盖main方法吗

不可以,因为main方法是静态方法。

7.4 Java方法重载和Java方法覆盖的区别

后面章节讲到,点击学习《Java方法重载和Java方法覆盖的区别

一点教程,一个分享编程知识的公众号。跟着站长一起学习和进步。

通俗易懂,深入浅出,一篇文章只讲一个知识点。

在公交、在地铁、在厕所都可以阅读,随时随地涨姿势。

文章不涉及代码,不烧脑细胞,人人都可以学习。

当你决定关注「一点教程」,你已然超越了90%的程序员!

一点教程二维码