1.简述
- 重载就是一个类可以有多个同名方法。
- 重写是指在子类继承父类的时候,可以改写父类方法的实现。
2.说明
首先定义一个Monster类。
class Monster {
private String nickname;
private String territory;
public Monster() {}
public Monster(String nickname) {
this.nickname = nickname;
}
public void earn(String slogan) {
System.out.println(slogan);
}
public String getName() {
return nickname;
}
public String getTerritory() {
return territory;
}
public void setTerritory(String territory) {
this.territory = territory;
}
public String toString() {
return "我是" + nickname;
}
}
接着再定义一个Goblin继承Monster。
class Goblin extends Monster {
public Goblin(String nickname) {
super(nickname);
}
}
到目前为止,上面的例子还只是一个很普通的继承关系,还没有出现重载与重写。接下来,在Goblin中定义两个方法。
class Goblin extends Monster {
public Goblin(String nickname) {
super(nickname);
}
public void earn(String slogan) {
System.out.print("我是" + this.getName() + "。");
super.earn(slogan);
}
public void earn(String role, String story) {
System.out.println(role + ": " + story);
}
}
然后,写个例子。
public class Story {
public static void main(String[] args) {
// TODO Auto-generated method stub
String slogan = "此山是我开,此树是我栽,要想从此过,留下买路财.";
Monster bullDemonKing = new Monster("平天大圣");
bullDemonKing.earn(slogan);
Goblin redBoy = new Goblin("圣婴大王");
redBoy.earn(slogan);
String role = "落难儿童";
StringBuilder story = new StringBuilder()
.append("师父呀,山西去有一条枯松涧,涧那边有一庄村,我是那里人家。")
.append("我祖公公姓红,只因广积金银,家私巨万,混名唤做红百万。")
.append("年老归世已久,家产遗与我父。")
.append("近来人事奢侈,家私渐废,改名唤做红十万,专一结交四路豪杰,将金银借放,希图利息。")
.append("怎知那无籍之人,设骗了去啊,本利无归。")
.append("我父发了洪誓,分文不借。")
.append("那借金银人,身贫无计,结成凶党,明火执杖,白日杀上我门,将我财帛尽情劫掳,把我父亲杀了,见我母亲有些颜色,拐将去做什么压寨夫人。")
.append("那时节,我母亲舍不得我,把我抱在怀里,哭哀哀,战兢兢,跟随贼寇,不期到此山中,又要杀我,多亏我母亲哀告,免教我刀下身亡,却将绳子吊我在树上,只教冻饿而死,那些贼将我母亲不知掠往那里去了。")
.append("我在此已吊三日三夜,更没一个人来行走。")
.append("不知那世里修积,今生得遇老师父,若肯舍大慈悲,救我一命回家,就典身卖命,也酬谢师恩,致使黄沙盖面,更不敢忘也。");
redBoy.earn(role, story.toString());
}
}
然后看一下运行结果。
解释一下上面的情况,上面在Monster中定义了一个earn方法,然后在Goblin中第把它给重写了,接着Goblin中又定义了一个新的earn方法,相当于又把自己的earn方法给重载了。翻译成故事就是,牛魔王每次去打劫(或者谋生?)的时候都把口号喊出来(通过earn方法),它的儿子红孩儿想在喊口号的时候把自己的外号也叫出来,于是就重写了老牛的earn方法。后来碰上了狠角色,觉得只是喊口号不太可行,于是就通过重载earn方法角色扮演了一把,装了一个可怜的角色,通过一个悲惨的故事骗取别人同情心然后作案。然后,结果就是师父又被妖怪抓走了。
所以,重载就是同一类多个同名的不同方法(比如,红孩儿遇弱则一声吼,遇强一部剧,都叫earn方法)。而重写就是改写一下父类的方法实现(就像红孩儿不仅要喊口号,还要喊外号一样)。
3.总结
在Java中的方法重载是通过同一个方法名而参数不同实现的。这里的参数不同包括参数类型和参数个数。
在Java中的方法重写是通过继承父类方法,并改写其方法体实现的。