
来看个试验。
先定义一个食物类,非常简单,就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();
}
}
结果编译出错了:
<pre>
.\Person.java:9: 错误: 已在类 Person中定义了方法 eat()
public void eat() {
^
1 个错误
</pre>
错误信息告诉我们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);
}
}
运行结果:
<pre>
张三自己在吃东西
张三自己在吃煎饼
张三和李四在吃东西
张三和李四在吃煎饼
</pre>
最后还有一点要注意,方法的参数是有顺序的。例如
public void eat(Person p, Food f)
和
public void eat(Food f, Person p)
虽然参数相同但是参数顺序不同,这样也算重载。
本文代码下载:百度网盘
网友评论