1. 程式人生 > 其它 >子類如何獲得的父類的私有成員變數?

子類如何獲得的父類的私有成員變數?

技術標籤:java反射

首先先講講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(); } } }

輸出:
在這裡插入圖片描述
這樣說明子類已經繼承了父類的私有成員變數。