java多态的静态实例
来源:互联网 发布:淘宝美工店铺装修教程 编辑:程序博客网 时间:2024/06/08 07:44
其实,我的笔记里早就写过这个知识点,但只是笼统概括了一下,下面用个小代码做个试验:
class CyberLanguage{
public static void show() {
System.out.println("CyberLanguage run");
}
}
class Java extends CyberLanguage{
public static void show() {
System.out.println("Java run");
}
}
public class StaticDemo{
public static void main(String args[]){
CyberLanguage cl = new CyberLanguage();
CyberLanguage cj = new Java();
cl.show();
cj.show();
}
}
第一眼看到这个代码,好像该程序应该只打印一个"CyberLanguage run"和一个"Java run"。毕竟,Java扩展自CyberLanguage,并且它的show方法重写了父类的。main方法调用了show方法,第一次是在cl上调用,第二次是在cj上调用。如果你运行该程序,就会发现它打印的是两次"CyberLanguage run"。这到底出什么问题了?
问题在于show是一个静态方法,而对静态方法的调用不存在任何动态的分派机制。当一个程序调用了一个静态方法时,要被调用的方法都是在编译时刻被选定的,而这种选定是基于修饰符的编译期类型而做出的,修饰符的编译期类型就是我们给出的方法调用表达式中圆点左边部分的名字。在本案中,两个方法调用的修饰符分别是变量cl和cj,它们都被声明为CyberLanguage类型。因为它们具有相同的编译期类型,所以编译器使得它们调用的是相同的方法:CyberLanguage.show。这也就解释了为什么程序打印出"CyberLanguage run"。
要订正这个程序,直接从两个show方法定义中移除掉static修饰符即可。通过覆写,你可以获得动态的分派;而通过隐藏,你却得不到这种特性。
- java多态的静态实例
- Java 的静态变量和实例变量
- Java实例说明 静态变量和实例变量的区别
- java:静态方法,静态变量,实例方法,实例变量的关系 ----李雪
- java静态变量与实例变量、静态方法与实例方法的区别
- Java静态变量初始化的一个实例的分析
- Java 中静态变量与实例变量的区别
- Java 静态方法和实例方法的区别
- Java类的静态变量和实例变量
- Java 中静态变量与实例变量的区别
- 解析Java中静态变量与实例变量的区别
- Java中静态变量与实例变量的区别
- 黑马程序员-java中静态变量,方法的使用实例
- java 静态方法和实例方法的区别
- java中的静态变量和实例变量的生命周期
- Java 静态变量和实例变量的生命周期
- 解析Java中静态变量与实例变量的区别
- Java中静态变量与实例变量的区别
- Java集合5:LinkedHashMap与LRU cache
- Java集合6:ArrayList的实现原理
- js正则匹配数字、大小写字母、下划线、中线和点
- Android 属性动画(Property Animation) 完全解析 (上)
- Java集合7:LinkedList的实现原理
- java多态的静态实例
- CSU1656: Paper of FlyBrother(后缀数组)
- Android 属性动画(Property Animation) 完全解析 (下)
- unity3D创建英雄选择栏
- 使用UltraISO制作U盘启动盘
- java基础--网络编程
- java笔记之一
- 深圳之行---错过
- 02-线性结构4. Pop Sequence (25)