重写和重载的区别

重写(overriding

重写是子类和父类多态性的表现,是子类重写父类的方法。子类重写父类的方法与父类中的方法有==相同的方法名==,返回类型和参数列表,子类函数的访问修饰符==大于等于父类==,重写方法==不能==抛出新的检查异常或者比重写方法更加==宽泛==的检查异常

重写规则 :

参数列表和返回类型必须与被重写的方法一致,重写的方法的访问权限要大于等于被写方法的权限,不能抛出新的检查异常或者更加宽泛的异常,比如父类方法中声明了一个检查异常是IOException,在重写这个方法的时候就不能重新抛出Exception,只能抛出IOException的子类异常,可以抛出非检查异常

  • 举个栗子 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    public class Father {

    public static void main(String[] args) {
    // TODO Auto-generated method stub
    Son s = new Son();
    s.sayHello();
    }

    public void sayHello() {
    System.out.println("父类");
    }
    }

    class Son extends Father {

    @Override
    public void sayHello() {
    // TODO Auto-generated method stub
    System.out.println("子类");
    }

    }

    重载(overLoading

方法重载就是让类用==统一的方式处理不同类型的数据==的一种手段,函数名相同参数类型参数个数不相同。返回值的类型可以相同也可以不相同,无法以返回值的类型作为是否是函数重载的判断,可以抛出不同的异常,调用方法的时候,通过传递给他们不同的参数个数和参数类型来决定具体使用哪个方法,是类中多态性的表现

重载的规则:

参数类型参数个数返回类型可以不同,可以有不同的访问修饰符,可以抛出不同的异常

  • 举个栗子 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public class Father {

    public static void main(String[] args) {
    // TODO Auto-generated method stub
    Father s = new Father();
    s.sayHello();
    s.sayHello("GouL Yu");

    }

    public void sayHello() {
    System.out.println("Hello");
    }

    public void sayHello(String name) {
    System.out.println("Hello" + " " + name);
    }
    }

    总结

    方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在==一个类中==,同名的方法如果有不同的参数列表(同类下的同名方法,参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在==子类与父类==之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)