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()方法
所以多态不会决定重载方法的调用,只会决定重写方法的调用
相关文章推荐
- STS或eclipse安装SVN插件
- java金额类计算封装
- 代码块、继承、this、super、final(java基础知识八)
- Java中两种多线程实现方法:Thread类和Runnable接口的联系与区别
- java IO 三(字节流的使用)
- Maven pom文件提示Missing artifact org.springframework:spring-context-support:jar:3.2.2.RELEASE:compile
- Java基础随笔之静态导入
- STS或eclipse安装SVN插件
- Eclipse中Git的安装、配置、使用
- JAVA bean与XML互转的利器---XStream
- struts spring integration and test using junit4
- Java设计模式——享元模式
- Java设计模式——享元模式
- 身份证转换工具类(Java)
- A Year Of Books - 2016 Javaer书单
- A Year Of Books - 2016 Javaer书单
- STRUTS2 重定向能到WEB-INF下吗?
- JAVA 全局变量 声明与定义
- Java Web中界面之间传值的实现方法
- java谜题--java运行时修改引用类的静态常量