重载与重写

197 阅读2分钟

方法重载

定义:

 在同一类中,定义了多个重名的方法,这些同名方法具有同种功能。每个方法具有不同的参数类型或参数个数,这些同名的方法,就构成了重载关系.    
 简而言之:同类同名不同参,与返回值无关。(对于参数的不同:个数不同,顺序不同,类型不同) 。
 Java虚拟机就会通过参数的不同来找到重载的方法

案例:

1.与返回值无关 不构成重载:

public class test {
    public static int sum(int a){
        //xxxxx
    }

    public static void sum(int a){
        //xxxxx
    }
}

这里除了返回值其他都相同,因为重载的判断与返回值无关,所以不能构成重载。

2.与返回值无关 构成重载:

public class test {
    public static int sum(int a){
        //xxxxx
    }

    public static float sum(int a,int b){
        //xxxxx
    }
}

这里是重载的原因是参数个数不同,与int float无关。

3.参数类型不同 构成重载:

public class test {
    public static int sum(double a){
        //xxxxxx
    }

    public static int sum(int a){
        //xxxxxx
    }
}

4.不在同一个类,不构成重载:

public class test1 {
     public static int sum(int a){
         //xxxxxx
     }
}
public class test2 {
    public static int sum(double a){
        //xxxxxx
    }
}

5.参数顺序不同 构成重载(不推荐这样构造)

public class test {
     public static int sum(int a,double b){
         //xxxxxx
     }
    public static int sum(double a,int b){
        //xxxxxx
    }
}

方法重写

定义:

需求: 当父类的方法不满足子类的需求时,需要进行方法的重写
在继承关系中,子类出现了和父类一模一样的方法声明,我们就称子类这个方法就是重写的方法。
@Override可以放在重写的方法上面,检验是否书写正确,建议每次重写都加上@Overrrid

举例:

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

        OverseasStudent o=new OverseasStudent();
        o.lunch();
    }
}
class Person{
    public void eat(){
        System.out.println("吃米饭");
    }
    public void drink(){
        System.out.println("喝水");
    }
}
class OverseasStudent extends Person {
    public void lunch(){
        eat();
        drink();
    }
    @Override
    //方法的重写
    public void eat(){
        System.out.println("吃汉堡");
    }
}

我们创建的父类是“吃米饭”,“喝水”留学生和我们饮食习惯不同,所以我们在子类重写方法->eat最后控制台打印结果为

image.png

方法重写的本质:

image.png

如果子类发生了方法重写,会覆盖父类中的方法

image.png

方法重写的本质:子类的方法覆盖了在父类继承下来的虚方法表里面的方法就成为方法的重写。

方法重写的注意事项:

重写的方法尽量与父类一致。 
子类重写父类方法时:访问权限子类必须大于等于父类
                  返回值类型子类必须小于等于父类
只有被添加到虚方法表里面的方法才能被重写