除了私有属性不可访问,默认、protected、public都可以访问。
如下图,priName
是父类的私有属性,子类对象s就不能访问priName,但是可以访问默认属性name
。
在HashMap中,Node的内部属性都是默认的。HashMap和LinkedHashMap又在同一个包java.util.*
下面,所以LinkedHashMap.Entry可以访问到HashMap.Node。
LinkedHashMap.Entry继承自HashMap.Node,其内部属性都是默认的。
HashMap.TreeNode继承自LinkedHashMap.Entry,内部属性也是默认的。
所以TreeNode理论上应该能够访问到父类所有的属性。HashMap.Node不是public,所以程序员不能直接获取HashMpa.Node对象。问题不大用反射看看所有的可访问的默认属性:
public static void main(String[] args) {
try {
Class cls = Class.forName("java.util.HashMap$TreeNode");
while (!Object.class.equals(cls)) {
System.out.println(cls.getSimpleName()+": ");
Field[] temp = cls.getDeclaredFields();
for (Field f : temp) {
String modifier = Modifier.toString(f.getModifiers());
if (!modifier.contains("private")&&!modifier.contains("protected")&&!modifier.contains("public")) {
if (!f.getName().startsWith("$")) {
//过滤掉 $assertionsDisabled
System.out.print(f.getName() + " ");
}
}
}
System.out.println();
cls = cls.getSuperclass();
}
} catch (Exception e) {
e.printStackTrace();
}
}
运行结果: