看普通的重载如下:
class Animal { }
class Horse extends Animal { }
class Test {
public void doStuff(Animal a) {
System.out.println("进入Animal方法");
}
public void doStuff(Horse h) {
System.out.println("进入Horse方法");
}
public static void main (String [] args) {
Test ua = new Test();
Animal animalObj = new Animal();
Horse horseObj = new Horse(); //代码段A
ua.doStuff(animalObj);
ua.doStuff(horseObj);
}
}
打印如下为如下信息:
调用Animal方法
调用Horse方法
但是如果将代码段A改成如下代码:
Animal horseObj = new Horse();
该代码虽然是典型的多态行为,在运行时实际使用的是Horse对象,但是打印信息会是“调用Horse方法”吗?
我们先看结果:
进入Animal方法
进入Animal方法
打印并不是像我们想象的那样,这是为什么呢?这是因为重载方法的调用在编译就已决定(编译时horseObj是Animal对象,在运行时时Horse对象),所以打印结果就会如此。
看如下代码:
public class Animal {
public void eat() {
System.out.println("普通动物的吃法");
}
}
class Horse extends Animal {
public void eat() {
System.out.println("马吃草 ");
}
public void eat(String s) {
System.out.println("马吃 " + s);
}
public static void main (String[] args){
System.out.println("---------1-------- ");
Animal a = new Animal();
a.eat();
System.out.println("---------2-------- ");
Horse h = new Horse();
h.eat();
System.out.println("---------3-------- ");
Animal ah = new Horse();
ah.eat();
System.out.println("---------4-------- ");
Horse he = new Horse();
he.eat("苹果");
// Animal a2 = new Animal();
// a2.eat("treats"); //编译错误,因为Animal没有eat( String s)方法
// Animal ah2 = new Horse();
// ah2.eat("Carrots"); //编译错误,因为Animal没有eat( String s)方法,虽然在运行时是Horse对象,但在编译时是Animal对象
}
}
打印结果如下:
---------1--------
普通动物的吃法
---------2--------
马吃草
---------3--------
马吃草
---------4--------
马吃 苹果
第3次的调用为典型的多态行为,将会调用Horse的eat()方法
所以多态不会决定重载方法的调用,只会决定重写方法的调用