父类中的私有字段会不会被子类继承?

父类(没有 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 : 它获取的是 当前类声明 的所有字段(不管访问性如何)

结论

如果父类仅仅是一个私有字段,而不提供任何访问或修改的接口话,对于子类是完全不可见的,也没有提供其他方式可以间接访问或修改(比如反射),所以可以认为,父类的私有字段是不能被继承的。

参考资料

stackoverflow