Java的多态性表现在2个方面,1方法的覆盖、2方法的重载。
/** * @ClassName Polymorphic * @author derick * @date 2013-5-13 * @Description */ public class PolymorphicTest { public static class Human{ public void say(){ System.out.println("Human say!"); } } public static class Man extends Human{ public void say(){ System.out.println("Man say!"); } } public static class Woman extends Human{ public void say(){ System.out.println("Woman say!"); } } public static void say(Human h){ System.out.println("say Human!"); } public static void say(Man h){ System.out.println("say Man!"); } public static void say(Woman h){ System.out.println("say Woman!"); } public static void main(String[] args) { Human man = new Man(); Human woman = new Woman(); //重载 say(man); say(woman); //覆盖 man.say(); woman.say(); } }
运行结果
say Human!
say Human!
Man say!
Woman say!
say Human!
Man say!
Woman say!
从输出结果来看,方法的覆盖和重载表现的不太一致。方法的覆盖安照预期的结果调用了子类的say方法;但方法的重载视乎超预期没有调用相应的子类参数的方法。在方法重载的选择中,为什么会选择形参类型为Human的重载呢?在解决这个问题前,我们先按照如下代码定义两个重要的概念:
Human man = new Man();
我们把上面的代码中“Human”称为变量的静态类型或者外观类型,后面的“Man”则称为变量的实际类型。静态类型编译期可知,实际类型运行时才可确定。
在上面main方法的代码中刻意定义了2个静态类型相同、实际类型不同的变量,但虚拟机(准确地说编译器)在重载时是通过参数的静态类型而不是实际类型作为判定的依据的。并且静态类型是编译期可知的,所以在编译阶段,Javac就根据参数的静态类型决定使用哪个重载版本,所以选择了say(Human)作为调用目标。
对于方法覆盖所表现出来的多态的输出结果,大家并不奇怪,它是在运行期根据实际类型来确定的。
相关推荐
55.java方法调用.zip55.java方法调用.zip55.java方法调用.zip55.java方法调用.zip55.java方法调用.zip55.java方法调用.zip55.java方法调用.zip55.java方法调用.zip55.java方法调用.zip55.java方法调用.zip55.java...
ACCP5.0 JAVA方法调用万年历!采用方法调用的形式来做的万年历·····
Java反射 调用空参方法 调用Object类型参数的方法 调用基本类型参数的方法 调用基本类型数组参数的方法 调用String数组参数的方法 调用Object数组参数的方法 调用私有方法
java方法调用
Android Studio项目,此Demo实现Java调用C++函数,然后C++函数回调Java方法、纯C++直接调用Java方法,此为github地址链接
利用java反射原理实现方法的动态调用。
java远程方法调用,可以实现远程调用,仅作参考
作者以易于理解的方式深入揭示了java虚拟机的内部工作原理,深入理解这些内容,将对读者更快速地编写更高效的程序大有裨益! 本书共分20章,第1-4章解释了java虚拟机的体系结构,包括java栈、堆、方法区、执行...
java 反射 调用私有方法(有参数私有方法)获取私有属性值
java 调用存储过程java 调用存储过程java 调用存储过程java 调用存储过程java 调用存储过程java 调用存储过程java 调用存储过程
通过Java反射调用方法,适合初级自学者,通俗易懂
Groovy 调用 Java 类groovy 调用 Java class 十分方便,只需要在类前导入该 Java 类,在 Groovy 代码中就可以无缝使用该
JAVA调用DLL JAVA调用DLLJAVA调用DLLJAVA调用DLLJAVA调用DLLJAVA调用DLL
在java中调用C语言的函数,对初学者很不错的实例! 在java中调用C语言的函数,对初学者很不错的实例!
57.java带参数方法调用.zip57.java带参数方法调用.zip57.java带参数方法调用.zip57.java带参数方法调用.zip57.java带参数方法调用.zip57.java带参数方法调用.zip57.java带参数方法调用.zip57.java带参数方法调用.zip...
C#调用java类、jar包方法C#调用java类、jar包方法C#调用java类、jar包方法C#调用java类、jar包方法C#调用java类、jar包方法。
三种方式实现java远程调用(rmi) 方式一:原始方式 方式二:spring 方式三:jndi 解压,放到myeclipse上可用
Java调用R语言的方法, 配置环境和使用方法和详细使用。
基本作业练习:class Fan{ double speed; double radius; boolean on; int numOfFan; Fan(double speed,double radius ,boolean on ){ this.speed=speed; this.radius = radius; this.on = on;... }
Java Opencv系列:(配套代码下载)2.1Java中调用Opencv的方法