Java-方法重载、方法重写以及如何判断

Java-方法重载、方法重写以及如何判断

一、方法重载(overload)
  两同一不同:两同是指同一个类、方法名相同,一不同是指参数列表不同。

  是否为方法重载该如何区分?如下代码验证:

class MethodOverload {
    //方法1
    public void people(){
        System.out.println("刘备还是忠厚人呐");
    }
    //方法2
    public void people(String name){
        System.out.println("姓名:" + name);
    }
    //方法3
    public void people(String name,String behavior){
        System.out.println(name + "," + behavior);
    }
    //方法4
    public void people(String name,int age){
        System.out.println("姓名:" + name + ",年龄:" + age);
    }
    //方法5
    public void people(int age,String name){
        System.out.println("姓名:" + name + ",年龄:" + age);
    }
    /*------------------------------------------------------------
    public String people(int age,String name){
        System.out.println("姓名:" + name + ",年龄:" + age);
        return name;
        此方法和方法5相比较,仅返回值类型不同,但编译报错,下面的方法6使参数列表不同后可编译成功
    }
    ------------------------------------------------------------*/
    //方法6
    public String people(int age,String name,String behavior){
        System.out.println("姓名:" + name + ",年龄:" + age + behavior);
        return behavior;
    }
    /*------------------------------------------------------------
    protected String people(int age,String name,String behavior){
        System.out.println("姓名:" + name + ",年龄:" + age + behavior);
        return behavior;
        此方法和方法6相比较,仅修饰符不同,但编译报错,下面的方法7使参数列表不同后可编译成功
    }
    ------------------------------------------------------------*/
    //方法7
    protected String people(int age,String name,double salary){
        System.out.println("姓名:" + name + ",年龄:" + age);
        return name;
    }
}
class MethodOverloadTest extends MethodOverload{
    public static void main(String[] args) {
        MethodOverload mo = new MethodOverload();
        mo.people();
        mo.people("刘备");
        mo.people("刘备",300);
        mo.people(300,"刘备");
        mo.people(300,"刘备","织席贩履");
        mo.people(300,"关羽",5000000.0);
    }
}

解释: 首先前提是方法名相同,且在同一个类中;然后方法1到方法5,通过控制变量,验证得到:参数列表不同包括个数、类型、顺序,方法1、2、3说明参数列表需要个数不同,方法3、4说明参数列表需要类型不同,方法4、5说明参数列表需要前后顺序不同;结合以上代码中方法5和它下面的注释表明:仅返回值类型不同不构成重载;结合以上代码中方法6和它下面的注释表明:仅修饰符不同也不构成重载

总结: 判断是否为方法重载:判断得到同一类、方法名相同、参数列表不同即可,修饰符和返回类型无影响。

二、方法重写(override)
  当子类发现父类方法不适合自己时,需要重写父类的方法。
  2同2小1大:2同是指方法名相同、形参列表相同;2小是指返回值类型相同或更小、抛出的异常更小;1大访问权限相同或更大。

  如下代码示例:

class Human{
    public Object live(String name){
        return name + "会使用工具";
    }
}
class Asian extends Human{
    public void smart(String skincolor){
        System.out.println("聪明");
    }
    //重写父类的live()方法
    @Override
    public String live(String name){
        return name + "数学天赋强";
    }

}
class BlackPepple extends Human{
    public void dance(String skincolor){
        System.out.println("善舞");
    }
    //重写父类的live()方法
//    @Override
//    public String live(String name){
//        return name + "舞蹈天赋强";
//    }
}
class HumanTest{
    public static void main(String[] args) {
        Human h1 = new Human();
        System.out.println(h1.live("人类"));     //输出“人类会使用工具”
        Asian a1 = new Asian();
        System.out.println(a1.live("黄种人"));   //输出“黄种人数学天赋强”
        BlackPepple b1 = new BlackPepple();
        System.out.println(b1.live("非洲人"));   //输出“非洲人会使用工具”
        /*以上代码,若重写了父类的方法,那它的实例优先使用重写后的,若没有重写父类的方法,它的实例会使用父类的方法*/
    }
}

@Override注释,表示重写,编译时会验证此方法是否为父类所有,没有则报错,不符合方法重写规范也会报错。

你可能感兴趣的:(java,java)