Java学习笔记(十七) 重写与重载的区别

Java学习笔记(十七) 重写与重载的区别

重写(Override)

字面上看,重写就是 重新写一遍的意思。其实就是在子类中把父类本身有的方法重新写一遍。子类继承了父类原有的方法,但有时子类并不想原封不动的继承父类中的某个方法,所以在方法名,参数列表,返回类型(除过子类中方法的返回值是父类中方法返回值的子类时)都相同的情况下, 对方法体进行修改或重写,这就是重写。但要注意子类函数的访问修饰权限不能少于父类的。

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("Hello");
    }
}

class Son extends Father{
    
    

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

}

重写 总结:
1.发生在父类与子类之间
2.方法名,参数列表,返回类型(除过子类中方法的返回类型是父类中返回类型的子类)必须相同
3.访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)
4.重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常

Override注意事项

Override是覆盖了一个方法并且对其重写,以求达到不同的作用。对我们来说最熟悉的覆盖就是对接口方法的实现。另外,我们在继承中也可能会在子类覆盖父类中的方法。在覆盖时要注意以下几点:

1.覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;

2.覆盖的方法的返回值必须和被覆盖的方法的返回值一致

3.覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类

4.被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。

作者:勿念及时雨
链接:https://www.jianshu.com/p/3e650cf7a94e
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

重载(Overload)

在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同甚至是参数顺序不同)则视为重载。同时,重载对返回类型没有要求,可以相同也可以不同,但不能通过返回类型是否相同来判断重载。
例如:

public class Father {
    
    

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

    }

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

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

重载 总结:
1.重载Overload是一个类中多态性的一种表现
2.重载要求同名方法的参数列表不同(参数类型,参数个数甚至是参数顺序)
3.重载的时候,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准

Overloaded的方法是否可以改变返回值的类型

1.如果几个Overloaded的方法的参数列表不一样,它们的返回者类型当然也可以不一样。

2.如果两个方法的参数列表完全一样,是否可以让它们的返回值不同来实现重载Overload?答案是不行的。例如,我们调用map.remove(key)方法时,虽然remove方法有返回值,但是我们通常都不会定义接收返回结果的变量,这时候假设该类中有两个名称和参数列表完全相同的方法,仅仅是返回类型不同,java就无法确定编程者倒底是想调用哪个方法了,因为它无法通过返回结果类型来判断

Overload注意事项

Overload是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后再调用时,VM就会根据不同的参数样式,来选择合适的方法执行。在重载时要注意以下几点:

1.在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是fun(int,float),但是不能为fun(int,int));

2.不能通过访问权限返回类型抛出的异常进行重载;

3.方法的异常类型数目不会对重载造成影响;

4.对于继承来说,如果某一方法在父类中是访问权限是priavte,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。

重载(Overload)和重写(Override)的区别

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

Guess you like

Origin blog.csdn.net/qq_45205390/article/details/120988361