方法重载与方法覆盖

一.方法覆盖

① 方法覆盖发生在具有继承关系的父子类之间,这是首要条件;
② 覆盖之后的方法与原方法具有相同的返回值类型、相同的方法名、相同的形式参数列表
③覆盖之后的方法不能比原方法拥有更低的访问权限,可以更高(学习了访问控制权限修饰符之后你就明白了);
④ 覆盖之后的方法不能比原方法抛出更多的异常,可以相同或更少(学习了异常之后就明白了);
⑤与了多态机制之后相同的返回值类型"可以修改一下吗?
对于返回值类型是基本数据类型来说,必须一致
对于返回值类型是引用数据类型来说,重写之后返回值类型可以变的更小但不能变大(但意义不大,开发无意义)

public class OverrideTest01 {
    
    
    public static void main(String[] args) {
    
    
        Bird2 b=new Bird2();
        b.move2();
        Cat2 c=new Cat2();
        c.move2();
        c.move2(1);//构成方法重载
    }
}
class Animal2{
    
    
    public void move2() {
    
    
        System.out.println("fly");
    }
}
class Bird2 extends Animal2 {
    
    

    public void move2() {
    
    
        System.out.println("I want fly");
    }
}    
 /*   private void move2(){
        System.out.println("I want fly");
    }
}*/
class Cat2 extends Animal2 {
    
    
    public void move2(int i){
    
    
        System.out.println("I want talk");
    }
}

I want fly
I want talk

私有方法不可覆盖,静态方法覆盖没什么意义

public class OverrideTest06{
    
    
    private void dosome(){
    
    
        System.out.println("private dosome method dosome execute");
    }
    public static void main(String[] args){
    
    
        OverrideTest06 at=new T();
        at.dosome();
    }
}
class mytest{
    
    
    public static void main(String[] args){
    
    
        OverrideTest06 ot = new T();
        ot.dosome();

    }
}
class T extends OverrideTest06{
    
    

    public void dosome(){
    
    
        System.out.println("T 's public dosome method execute");
    }
}

//经过测试,私有方法不可覆盖

注意事项

注意1:方法覆盖只是针对于方法,和属性无关。
注意2:私有方法无法爱盖
注意3:构造方法不能被继承,所以构造方法也不能被爱盖
注意4:方法覆盖只是针对于实例方法",静态方法覆盖”没有意义。

二.方法重载

方法重载(overload)是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数。

public class OverloadTest01 {
    
    
    public static void main(String[] args) {
    
    

        System.out.println(sum(10,20));

        System.out.println(sum(20.0,30.0));
        System.out.println(sum(20L,50L));
    }

    public static int sum(int a,int b) {
    
    
        return a+b;
    }
    public static double sum(double a,double b){
    
    
        return  a+b;
    }
    public static long sum(Long a,Long b){
    
    
        return a+b;
    }
}

代码满足以下三个条件的时候构成方法重载
① 在同一个类当中。
② 方法名相同。
③ 参数列表不同:个数不同算不同,顺序不同算不同,类型不同也算不同。

public class OverloadTest02 {
    
    
    public static void main(String[] args) {
    
    
        m1();
        m1(10,20.0);
        m2(20.0,10);
        //m5();
        //m6();
    }
    public static void m1(){
    
    

    }
    public static void m1(int a,double b){
    
    
        System.out.println("int a,double b");
    }
    public static void m2(double a,int b){
    
    
        System.out.println("double a,int b");
    }
    /*

    public static int m5(){
        return 1;
    }
    public static double m5(){
        return 1.0;
    }
    public static void m6(){

    }
    static void m6(){
        
    }*/
}


int a,double b
double a,int b
从m5,m6可知方法重载与返回值类型修饰符列表无关
引申:我们从System.out.println()中可以体会到println其实也是一种方法重载

三.方法重载和方法覆盖有什么区别?

方法重载发生在同一个类当中
方法覆盖是发生在具有继承关系的父子类之间。
方法重载是一个类中,方法名相同,参数列表不同
方法覆盖是具有继承关系的父子类,并且重写之后的方法必须和之前的方法一致:方法名一致、参数列表一致、返回值类型一致

猜你喜欢

转载自blog.csdn.net/lpblog/article/details/118117744
今日推荐