您的位置:首页 > 编程语言 > Java开发

Java的多态在方法重载和重写时的情况

2016-04-25 14:02 477 查看
看普通的重载如下:
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()方法

所以多态不会决定重载方法的调用,只会决定重写方法的调用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: