深入理解JAVA的多态性
来源:互联网 发布:plc编程器 编辑:程序博客网 时间:2024/05/22 12:35
Java的多态性表现在2个方面,1方法的覆盖、2方法的重载。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/**
* @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)作为调用目标。
对于方法覆盖所表现出来的多态的输出结果,大家并不奇怪,它是在运行期根据实际类型来确定的。
0 0
- 深入理解java的多态性
- 深入理解JAVA的多态性
- 深入理解java多态性
- 深入理解java多态性
- 深入理解java多态性
- 深入理解Java多态性
- 深入理解Java多态性
- 深入理解Java多态性
- 深入理解java多态性
- 深入理解java多态性
- 深入理解java多态性
- 深入理解java多态性
- 深入理解java多态性
- 深入理解java多态性
- 深入理解Java多态性
- 深入理解java多态性
- 深入理解java多态性
- 深入理解Java多态性
- [Objective-C]关联(objc_setAssociatedObject、objc_getAssociatedObject、objc_removeAssociatedObjects)
- 解决Failed to instantiate the default view controller for UIMainStoryboardFile 'Main'
- C语言中sizeof的用法
- junit4学习笔记
- OC-局部变量和全局变量、结构体、预处理指令以及关键字的基本使用
- 深入理解JAVA的多态性
- 自己看的和整理的一些经典技术博客列表BLOG
- C++学习笔记
- JS拖动效果实现
- URAL 1068. Sum (小学数学题)
- android的Bitmap和Drawable用法
- This Android SDK requires Andriod Developer Toolkit version 20.0.0 or above
- hdu-4513 吉哥系列故事——完美队形II 【Manacher】
- Tomcat Web Application Manager 如何进入