首先先讲讲Java中继承的成员访问特点:
1.构造方法不能被继承
2.继承后私有成员的访问规则:
- 父类的“私有成员”可以被子类继承,但子类不能直接访问。
- 当通过“子类”访问非私有成员时,先在子类中找,如果找到就使用子类的,找不到就继续去“父类”中找。
还是上代码来讲把:
class Father{
private String name="hello";
}
class Children extends Father{
}
public class Test {
public static void main(String[] args) {
Children children = new Children();
//System.out.println(children.name);// 编译报错
}
}
嗯,这只能证明子类无法访问父类的私有属性,那怎么证明他被继承了呢?
我们可以使用暴力反射,拿到子类继承的属性,上代码!
package com.hy;
import com.hy.children.Chiledren;
import java.lang.reflect.Field;
/**
* @author HY
* @ClassName PrivateTest
* @Description TODE
* @DateTime 2021/1/11 15:22
* Version 1.0
*/
public class PrivateTest {
public static void main(String[] args) {
try {
//Field getDeclaredField(String name);根据成员变量名获得对应Field对象,包括public、protected、(默认)、private的
Field field = Chiledren.class.getSuperclass().getDeclaredField("name");
//暴力反射,设置为可以直接访问私有类型的属性。
field.setAccessible(true);
//实例化子类
Chiledren children = Chiledren.class.newInstance();
//拿到子类对象中名为name域的值
System.out.println(field.get(children));
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出:
这样说明子类已经继承了父类的私有成员变量。