Java 中私有字段的继承问题
Contents
父类中的私有字段会不会被子类继承?
父类(没有 get , set)
package org.agoncal.sample.jmh;
public class Test {
private int age;
}
子类:
package org.agoncal.sample.jmh;
/**
* Created by emacsist on 2017/7/10.
*/
public class Test2 extends Test {
private String name;
}
反射获取 age
getField
package org.agoncal.sample.jmh;
import java.lang.reflect.Field;
/**
* Created by emacsist on 2017/7/11.
*/
public class App {
public sntatic void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
Test2 t = new Test2();
Field field = t.getClass().getField("age");
field.setAccessible(true);
int age = (int)field.get(t);
System.out.println(age);
}
}
发现它报:
Exception in thread "main" java.lang.NoSuchFieldException: age
at java.lang.Class.getField(Class.java:1703)
at org.agoncal.sample.jmh.App.main(App.java:11)
getDeclaredField
package org.agoncal.sample.jmh;
import java.lang.reflect.Field;
/**
* Created by emacsist on 2017/7/11.
*/
public class App {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
Test2 t = new Test2();
Field field = t.getClass().getDeclaredField("age");
field.setAccessible(true);
int age = (int)field.get(t);
System.out.println(age);
}
}
发现它报:
Exception in thread "main" java.lang.NoSuchFieldException: age
at java.lang.Class.getDeclaredField(Class.java:2070)
at org.agoncal.sample.jmh.App.main(App.java:11)
getField VS getDeclaredField
getField : 它获取的是所有继承层次上的所有 public 的字段(自身的,以及父类的) getDeclaredField : 它获取的是 当前类声明 的所有字段(不管访问性如何)
结论
如果父类仅仅是一个私有字段,而不提供任何访问或修改的接口话,对于子类是完全不可见的,也没有提供其他方式可以间接访问或修改(比如反射),所以可以认为,父类的私有字段是不能被继承的。