子類如何獲得的父類的私有成員變數?
阿新 • • 發佈:2021-01-13
首先先講講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();
}
}
}
輸出:
這樣說明子類已經繼承了父類的私有成員變數。