JAVA更多的类谜题72:终极危难
这个谜题旨在测试当你试图隐藏最后一个域时会发生什么。下面的程序会做什么?
class Jeopardy {
public static final String PRIZE = " $ 64000 ";
}
public class DoubleJeopardy扩展了Jeopardy {
public static final String PRIZE = " 2美分";
public static void main(String[]args){
system . out . println(double jeopardy。奖);
}
}
因为处于危险中的PRIZE域被声明为public和final,所以您可能认为Java语言会阻止您在子类中重用该域名。毕竟,最终类型方法不能被重写或隐藏。如果你试着运行这个程序,你会发现它可以编译没有任何问题,它会打印2美分。哪里出了问题?
可以证明,对于方法和域来说,最终的修饰符意味着完全不同的东西。对于方法,final意味着该方法不能被覆盖(例如方法)或隐藏(对于静态方法)[JLS 8.4.3.3]。对于一个域,最终意味着该域不能被分配超过一次[JLS 8.3.1.2]。相同的关键字,但其行为完全无关。
在这个程序中,最终域名DoubleJeopardy。奖品隐藏最终域危险。奖,其净亏损达到63,999.98美元。虽然我们可以隐藏一个域,但这通常不是一个好主意。正如我们在谜题66中所讨论的,隐藏域可能会违反包容性,并混淆我们对类型及其成员之间关系的直觉。
如果你想保证Jeopardy类中的奖品可以保存在子类中,那么你应该使用一个final方法,而不是final域:
class Jeopardy {
Private Static Final String Prize = " $ 64000 ";
公共静态最终字符串奖(){
返回奖;
}
}
对于语言设计者来说,教训是避免在不相关的概念之间重用关键字。一个关键字应该只在密切相关的概念之间重用,这可以帮助程序员建立一个关于混淆的语言特性之间的关系的印象。就Java的final关键字而言,重用会导致混乱。需要注意的是,作为一种历史悠久的语言,在不相关的概念之间重用关键词是一种自然趋势,可以避免引入新的关键词,这对语言的稳定性有很大的危害。当语言设计者考虑做什么时,他们总是选择两害相权取其轻。
简而言之,避免在不相关的变量或不相关的概念之间重用名称。对不相关的概念使用不同的名称有助于读者和程序员区分这些概念。
0条评论