class P { public String name = "P"; } class S extends P { // 隐藏父类的name域,而不像方法属于重写 private String name = "S"; } publicclass Test { publicstaticvoid main(String[] args) { // !! S.name is not visible // !! System.out.println(new S().name); // 属性不能被重写,只是被隐藏,所以不具有多态性为 System.out.println(((P) new S()).name);// p } } 属性的调用与静态方式的调用一样,只与前面引用类型相关,与具体的实例没有任何关系。 当你在声明一个域、一个静态方法或一个嵌套类型时,如果其名与基类中相对应的某个可访问的域、方法或类型相同时,就会发生隐藏。
class X { staticclass Y { static String Z = "Black"; } static C Y = new C(); } class C { String Z = "White"; } publicclass T { publicstaticvoid main(String[] args) { System.out.println(X.Y.Z);// White System.out.println(((X.Y) null).Z);// Black } } 当一个变量和一个类型具有相同的名字,并且它们位于相同的作用域时,变量名具有优先权。变量名将遮掩类型名。相似地,变量名和类型名可以遮掩包名。
for (int i = 0; i < 1; i++) Object o ; //!! 编译不能通过 for (int i = 0; i < 1; i++) Object o = new Object(); //!! 编译不能通过 一个本地变量声明看起来像是一条语句,但是从技术上来说不是。 Java语言规范不允许一个本地变量声明语句作为一条语句在for、while或do循环中重复执行。 一个本地变量声明作为一条语句只能直接出现在一个语句块中(一个语句块是由一对花括号以及包含在这对花括号中的语句和声明构成的): for (int i = 0; i < 1; i++) { Object o = new Object(); // 编译OK }