java解惑之静态方法覆盖
class Dog {
public static void bark() {
System.out.print("woof ");
}
}
class Basenji extends Dog {
public static void bark() { }
}
public class Bark {
public static void main(String args[]) {
Dog woofer = new Dog();
Dog nipper = new Basenji();
woofer.bark();
nipper.bark();
}
}
随意地看一看,好像该程序应该只打印一个woof。毕竟,Basenji 扩展自Dog,并且它的bark方法定义为什么也不做。main方法调用了bark方法,第一次是在Dog 类型的woofer上调用,第二次是在Basenji类型的nipper上调用。如果你运行该程序,就会发现它打印的是woof woof。
问题在于bark 是一个静态方法,而对静态方法的调用不存在任何动态的分派机制[JLS 15.12.4.4]。当一个程序调用了一个静态方法时,要被调用的方法都是在编译时刻被选定的,而这种选定是基于修饰符的编译期类型而做出的,修饰符的编译期类型就是我们给出的方法调用表达式中圆点左边部分的名字。在本案中,两个方法调用的修饰符分别是变量woofer和nipper,它们都被声明为Dog类型。因为它们具有相同的编译期类型,所以编译器使得它们调用的是相同的方法:Dog.bark。这也就解释了为什么程序打印出woof woof。尽管nipper 的运行期类型是Basenji,但是编译器只会考虑其编译器类型。
要订正这个程序,直接从两个bark 方法定义中移除掉static 修饰符即可。这样,Basenji 中的bark方法将覆写而不是隐藏Dog中的bark方法,而该程序也将会打印出woof,而不是woof woof。通过覆写,你可以获得动态的分派;而通过隐藏,你却得不到这种特性。
当你调用了一个静态方法时,通常都是用一个类而不是表达式来标识它:例如,Dog.bark 或Basenji.bark。当你在阅读一个Java 程序时,你会期望类被用作为静态方法的修饰符,这些静态方法都是被静态分派的,而表达式被用作为实例方法的修饰符,这些实例方法都是被动态分派的。通过耦合类和变量的不同的命名规范,我们可以提供一个很强的可视化线索,用来表明一个给定的方法调用是动态的还是静态的。本谜题的程序使用了一个表达式作为静态方法调用的修饰符,这就误导了我们。千万不要用一个表达式来标识一个静态方法调用。
Basenji.bark(); // 什么也不输出
Dog.bark(); // 输出woof
对语言设计者的教训是:对类和实例方法的调用彼此之间看起来应该具有明显的差异。第一种实现此目标的方式是不允许使用表达式作为�
相关文档:
来到广州7天了,还没有一个面试电话,一起来仨.net今天都面试去,一个人在房间里极度郁闷,自认为还算是个人品、技术都不错的一优秀女青年,难道真如传说中的,有性别歧视?未必吧,昨天就见到一个,那个漂亮。。。岂一个楚楚动人了得啊。。。
哎。。悲哀呀!
待续。。。。。。 ......
教你怎样在java的应用程序中加入声音
最近在做java课程设计,想在应用程序(有main()函数的)中加入声音,大家知道
在 Java applet 中声音播放任务很简单,但是在应用程序中缺少这样的支持。现在告诉你如何
在 Java 应用程序中播放声音文件。
看了好多资料发现在 Java 应用程序中播放声音文件在现有发行的 Java ......
现在常用的开源数据连接池主要有c3p0,dbcp和proxool三种,其中:
¨ hibernate开发组推荐使用c3p0;
¨ spring开发组推荐使用dbcp (dbcp连接池有weblogic连接池同样的问题,就是强行关闭连接或数据库重启后,无 ......
这都是我学习JAVA亲身经历的心得,今天花了一个多小时总结出来希望对大家有一定的帮助。如果如总结不妥,请指出和批评!为学习JAVA的初学者铺条学习JAVA的道路
首先大家要明确一点,外面招聘JAVA的,主要是指的J2EE,也就是BS结构(浏览器和服务器结构)JAVA的之所以火起来真是因为BS结构,并不在CS结构,所以那种大型网游 ......
21天学通Java6 下载地址 http://d.download.csdn.net/down/2031000/bolike(只有源代码)
<<21天学通Java 2(第二版)>>(中英文版PDF)+附书源码 下载地址 http://www.zzx8.com/html/c16246.html(似乎中英文的不对应,看中文还是看英文的?) ......