首页 > 代码库 > Java解惑七:更多类之谜
Java解惑七:更多类之谜
谜题66
继承的问题。对于实例方法:命名相同时,子类会覆写父类的方法,且访问权限至少和父类一样大。对于域:命名相同时,子类会隐藏父类的域,且访问权限任意。
谜题67
不要重用库中的类名。
谜题68
命名的问题。类名应该以大写字母开头,形式为:MixedCase。变量以小写字母开头,形式为:mixedCase。常量以大写字母开头,形式为:MIXED_CASE。单个大写字母,只能用于类型参数,形式为:Map<K, V>。包名应该都是小写,形式为:lower.case。当一个变量和一个类型具有相同的名字,并且作用于相同的作用域时,变量名具有优先权。即:变量名遮掩(obscure)类型名。同样变量名和类型名可以遮掩包名。class X { static class Y { static String Z = "Black"; } static C Y = new C(); } class C { String Z = "White"; } public class ShadesOfGray { public static void main(String[] args) { System.out.println(X.Y.Z); //输出结果是:White } }
谜题69
如何引用上题中的被遮掩的类型名。技巧在某一种特殊的语法上下文环境中使用该名字,语法上下文环境允许出现一个类型名但是不允许出现变量。技巧一<span style="font-size:18px;"> System.out.println(((X.Y)null).Z);</span>技巧二<span style="font-size:18px;">static class Xy extends X.Y{}; System.out.println(Xy.Z);</span>技巧三: 5.0版本之后<span style="font-size:18px;">public static <T extends X.Y> void main(String[] args) { System.out.println(T.Z); }</span>
谜题70
具有包内访问权限修饰的方法的类,在其他包内被继承时,该方法不可能被覆写。即使是方法名相同,也是两个不同的方法。
谜题71
名字重用导致遮蔽(shade):一个声明只能遮蔽类型相同的另一个声明。静态导入Arrays.toString,当在类中使用toString()时,会调用Object类中的toString方法。
谜题72
名字重用的问题。final修饰符对于方法:实例方法不能覆写,静态方法不能隐藏。对于域:不能被赋值超过一次。因此可以被隐藏。
谜题73
遮蔽:被遮蔽类型可以来自外围类,而不是来自库。隐藏:本来调用的父类的变量,结果声明了一个同名的私有的变量。
谜题74
重载方法要确定所有的重载版本一致。
谜题75
版本升级后带来的不一致,了解即可。
名字重用术语表
覆写(override)
一个实例方法可以覆写(override)在其超类中可访问大的具有相同签名的所有实例方法,从而能动态分派,,VM将基于实例运行期类型来选择要调用的覆写方法。class Base { public void f(){} } class Derived extends Base { public void f() {} //override Base.f() }重载(overload)
同一个类中,方法名相同,签名不同。重载的方法是编译期选定的class A { public void f (int i){} public void f (String s) {} }隐藏(hide)
子类中的一个域、静态方法或成员类型可以隐藏超类中可访问到具有同名的所有与、静态方法或成员类型。隐藏一个成员将阻止其被继承。class Base { public static void f() {} } class Derived extends Base { public static void f() {} }遮蔽(shadow)
变量、方法或类型可以遮蔽文本范围内具有相同名字的所有变量、方法、或类型。class WhoKnows { static Stirng sentence = "I do not know"; public static void main(String [] args) { String sentence = "i know"; //shadow static field system.out.println(sentence); } }遮掩(obscure)
变量可以遮掩同一范围内相同名字的类型,变量或者类型可以遮掩一个包。public class Obscure { static String System; //Obscures type java.lang.System public static void main(String[] args) { System.out.println("hello"); //won't compile } }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。