欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java重写(Override)与重载(Overload)的那些事儿

程序员文章站 2024-03-16 23:09:52
...

首先我们应该清楚Java为了程序员在使用Java面向对象编程中的方便,提供了三种对于面向对象编程重要的功能:封装、继承、多态。而其中 继承通过extends和implements关键字实现了代码的可重用性以此大大地为程序员提高了编写代码的工作效率,那么为了以简化代码提高工作效率在现实生活中的多变性使得仅仅靠普通的继承过程中就会引起一系 列用户对程序的需求不能够及时灵活地满足,以此Java在继承时诞生出了方法重写和方法重载的概念方便程序员编写代码。

方法重写
指的是在继承时,如果父类的方法无法满足子类的需求。子类需要对继承来的方法进行一些修改,即在子类中如果创建了一个与父类中相同名称、相同返回值类型、相同参数列表的方法,只是方法体中的实现不同,以实现不同于父类的功能,这种方式被称为方法重写。

那么既然有对于不同情况时进行方法重写,所以Java会对方法重写设定一些什么条件下可以方法重写的规则,即:

  • 方法重写时,方法名与形参列表必须一致。
  • 方法重写时,子类的权限修饰符必须要大于或者等于父类的权限修饰符。
  • 方法重写时,子类的返回值类型必须要小于或者等于父类的返回值类型。
  • 方法重写时,子类抛出的异常类型要小于或者等于父类抛出的异常类型。
    (注:其大小比较指的是其权限修饰符、返回值类型、异常类型的功能大小比较,比如权限修饰符public能够被调用的范围就比private的大)

举例
//在父类Animal中构造无参函数()
class Animal{
public void run(){
System.out.println(“animal is running”);
}
}

//在子类Dogs中构造和父类Animal同名的无参函数run(),并修改该函数内容,其函数名、返回值类型、参数列表访问权限与父类相同
class Dogs extends Animal{
public void run(){
System.out.println(“Dog is running”);
super.run()//调用父类的run方法
}
}

//在另一个java文件中创建Dogs对象运行无参函数run()
public class inheritenceTest{
public static void main(String[] args){
Dogs dog = new Dogs();
dog.run();
}
}


输出结果:
Dog is running;
animal is running;


方法重载
而重载呢顾名思义,重新加载,其中重写改的是内容,而重载就类似是彻头彻尾的不改头但换面的体现。即,重载是在一个类里面,方法名相同,而参数不同。返回类型可以相同也可以不同。每个重载的方法(或者构造函数)都必须有一个独一无二的参数列表。因此最常用的地方就是构造器的重载。

故综上叙述可以大概推出方法重载的规则:

  • 被重载的方法必须改变参数列表(参数个数或类型不一样);
  • 被重载的方法可以改变返回类型;
  • 被重载的方法可以改变访问修饰符;
  • 被重载的方法可以声明新的或更广的检查异常;
  • 方法能够在同一个类中或者在一个子类中被重载。
  • 无法以返回值类型作为重载函数的区分标准。

实例:

public class Overloading {
public int test(){
System.out.println(“test1”);
return 1;
}

public void test(int a){
    System.out.println("test2");
}   

//以下两个参数类型顺序不同
public String test(int a,String s){
    System.out.println("test3");
    return "returntest3";
}   

public String test(String s,int a){
    System.out.println("test4");
    return "returntest4";
}   

public static void main(String[] args){
    Overloading o = new Overloading();
    System.out.println(o.test());
    o.test(1);
    System.out.println(o.test(1,"test3"));
    System.out.println(o.test("test4",1));
}

}


重写与重载之间的区别

区别点 重载方法 重写方法
参数列表 必须修改 一定不能修改
返回类型 可以修改 一定不能修改
异常 可以修改 可以减少或删除,一定不能抛出新的或者更广的异常
访问 可以修改 一定不能做更严格的限制(可以降低限制)

总结
方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。

  • (1)方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading)。

  • (2)方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写(Overriding)。

  • (3)方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。

Java重写(Override)与重载(Overload)的那些事儿
Java重写(Override)与重载(Overload)的那些事儿
【注:图片借鉴自菜鸟教程】

相关标签: java