方法的重载与覆盖

孤街醉人 提交于 2020-03-01 08:33:56

方法重载(Overload)条件:
 方法名称相同
 方法参数类型、个数、顺序至少有一个不同
 方法的返回类型可以不同,因为方法重载和返回类型没有任何关系
 方法的修饰符可以不同,因为方法重载和修饰符没有任何关系
 方法重载只出现在同一个类中

代码示例
class Test {
public static void main(String[] args) {
int a = 10;
int b = 20;
int ret = add(a, b);
System.out.println("ret = " + ret);
}
public static int add(int x, int y) {
return x + y;
}
public static double add(int x, int y) {
return x + y;
}
}
// 编译出错
Test.java:13: 错误: 已在类 Test中定义了方法 add(int,int)
public static double add(int x, int y) {
^
1 个错误


当两个方法的名字相同, 参数也相同, 但是返回值不同的时候, 不构成重载.



使用重载
class Test1 {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        int ret = add(a, b);
        System.out.println("ret = " + ret);
        double a2 = 10.5;
        double b2 = 20.5;
        double ret2 = add(a2, b2);
        System.out.println("ret2 = " + ret2);
        double a3 = 10.5;
        double b3 = 10.5;
        double c3 = 20.5;
        double ret3 = add(a3, b3, c3);
        System.out.println("ret3 = " + ret3);
    }
    public static int add(int x, int y) {
        return x + y;
    }
    public static double add(double x, double y) {
        return x + y;
    }
    public static double add(double x, double y, double z) {
        return x + y + z;
    }
}
方法的名字都叫 add. 但是有的 add 是计算 int 相加, 有的是 double 相加; 有的计算两个数字相加, 有的是计算三个数
字相加.
同一个方法名字, 提供不同版本的实现, 称为 方法重载

方法的覆盖(Override)的条件:
什么叫方法的覆盖:子类实现父类的同名方法, 并且参数的类型和个数完全相同, 这种情况称为 覆写/重写/覆盖(Override)
 必须要有继承关系
 覆盖只能出现在子类中,如果没有继承关系,不存在覆盖,只存在重载
 在子类中被覆盖的方法,必须和父类中的方法完全一样,也就是方名, 返回类型、参数列表,完全一样
 子类方法的访问权限不能小于父类方法的访问权限
 子类方法不能抛出比父类方法更多的异常,但可以抛出父类方法异常的子异常
 父类的静态方法不能被子类覆盖(不被称为覆盖),静态方法处理的时候,访问权限发生错误也会提示覆盖
 父类的私有方法不能覆盖
 覆盖是针对成员方法,而非属性为什么需要覆盖?就是要改变父类的行为

方法权限示例: 将子类的 eat 改成 private
// Animal.java
public class Animal {
 public void eat(String food) {
 ...
 }
}
// Bird.java
public class Bird extends Animal {
 // 将子类的 eat 改成 private
 private void eat(String food) {
 ...
 }
}
// 编译出错
Error:(8, 10) java: com.bit.Bird中的eat(java.lang.String)无法覆盖com.bit.Animal中的
eat(java.lang.String)
 正在尝试分配更低的访问权限; 以前为public 




另外, 针对重写的方法, 可以使用 @Override 注解来显式指定.
// Bird.java
public class Bird extends Animal {
 @Override
 private void eat(String food) {
 ...
 }
} 
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!