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
本文地址:https://www.zhiletu.com/archives-243.html
关注公众号:智乐兔

赞赏

wechat pay微信赞赏alipay pay支付宝赞赏

上一篇
下一篇

相关文章

在线留言

你必须 登录后 才能留言!

在线客服
在线客服 X

售前: 点击这里给我发消息
售后: 点击这里给我发消息

智乐兔官微