【精致Java教程】29:方法的重载

【精致Java教程】29:方法的重载_第1张图片

来看个试验。
先定义一个食物类,非常简单,就name一个属性。

public class Food {

    public String name;

}

然后在定义一个人类,也很简单,一个name属性和两个eat方法。其中两个eat方法除了方法体其它都相同。

public class Person {

    public String name;

    public void eat() {
        System.out.println(name + "自己在吃东西");
    }

    public void eat() {
        Food f = new Food();
        f.name = "煎饼";
        System.out.println(name + "自己在吃" + f.name);
    }

}

然后写个Test类来测试一下:

public class Test {

    public static void main(String[] args) {
        Person zhangsan = new Person();
        zhangsan.eat();
    }

}

结果编译出错了:


.\Person.java:9: 错误: 已在类 Person中定义了方法 eat()
public void eat() {
^
1 个错误

错误信息告诉我们Java中一个类里有两个重复的方法是错误的。所谓重复方法指的是方法的签名重复,方法的签名指的是方法名和参数列表,不包括返回类型。换句话说Java不允许一个类里的两个方法的方法名和参数列表都相同。

既然如此,如果我们需要在类里定义两个以上方法名相同的方法,那么只能让他们的参数列表不同了。方法名相同而参数列表不同的方法就叫做重载。

修改示例中的Person类,对eat方法进行重载。

public class Person {

    public String name;
    
    // 以下是4个重载方法,方法名相同,参数列表不同
    public void eat() {
        System.out.println(name + "自己在吃东西");
    }

    public void eat(Food f) {
        System.out.println(name + "自己在吃" + f.name);
    }

    public void eat(Person p) {
        System.out.println(name + "和" + p.name + "在吃东西");
    }

    public void eat(Person p, Food f) {
        System.out.println(name + "和" + p.name + "在吃" + f.name);
    }
    
}

这样编译就不会出问题了,Java会根据调用eat()时传进来的参数而选择执行对应的eat()。

测试一下:

public class Test {
    
    public static void main(String[] args) {
        Person zhangsan = new Person();
        zhangsan.name = "张三";
        zhangsan.eat();
        
        Food f = new Food();
        f.name = "煎饼";
        zhangsan.eat(f);
        
        Person lisi = new Person();
        lisi.name = "李四";
        zhangsan.eat(lisi);
        
        zhangsan.eat(lisi, f);
    }
    
}

运行结果:


张三自己在吃东西
张三自己在吃煎饼
张三和李四在吃东西
张三和李四在吃煎饼

最后还有一点要注意,方法的参数是有顺序的。例如

public void eat(Person p, Food f)

public void eat(Food f, Person p)

虽然参数相同但是参数顺序不同,这样也算重载。

本文代码下载:百度网盘

你可能感兴趣的:(【精致Java教程】29:方法的重载)