Java常见疑难问题-类10
36. 属性只能被隐藏
class P {
public String name = “P”;
}
class S extends P {
// 隐藏父类的name域,而不像方法属于重写
private String name = “S”;
}
public class Test {
public static void main(String[] args) {
// !! S.name is not visible
// !! System.out.println(new S().name);
// 属性不能被重写,只是被隐藏,所以不具有多态性为
System.out.println(((P) new S()).name);// p
}
}
属性的调用与静态方式的调用一样,只与前面引用类型相关,与具体的实例没有任何关系。
当你在声明一个域、一个静态方法或一个嵌套类型时,如果其名与基类中相对应的某个可访
问的域、方法或类型相同时,就会发生隐藏。
37. 属性对嵌套类的遮掩
class X {
static class Y {
static String Z = “Black”;
}
static C Y = new C();
}
class C {
String Z = “White”;
}
public class T {
public static void main(String[] args) {
System.out.println(X.Y.Z);// White
System.out.println(((X.Y) null).Z);// Black
}
}
当一个变量和一个类型具有相同的名字,并且它们位于相同的作用域时,变量名具有优先权。
变量名将遮掩类型名。相似地,变量名和类型名可以遮掩包名。
38. 不能重写不同包中的defualt访问权限方法
package click;
public class P {
public void f() {
//因为子类没有重写该方法,所以调用的还是父类中的方法
prt();
}
void prt() {
System.out.println(“P”);
}
}
package hack;
import click.P;
public class T {
private static class S extends P {
// 这里没有重写父类的方法,因为父类方法不可见
void prt() {
System.out.println(“S”);
}
}
public static void main(String[] args) {
new S().f();// P
}
}
一个包内私有(default)的方法不能被位于另一个包中的某个方法直接重写。
声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 嗅谱网
转载请注明:转自《Java常见疑难问题-类10》
本文地址:http://www.xiupu.net/archives-243.html
关注公众号:
微信赞赏
支付宝赞赏