JAVA中的父類私有成員變數的繼承問題

2021-09-19 16:46:21 字數 1666 閱讀 3310

如果父類中屬性為私有(private),那麼能否被子類繼承呢?

答案是不可以。

我們看如下簡單**

class

father

}class

sonextends

father

public

class

privatefieldtest

}

得到的結果是:

my name is null

my name is null

這裡我們使用的都是預設建構函式,子類自動引用父類的預設建構函式。直接構造為null。

這樣,son類繼承了father類的sayhi方法,那麼自然,son的sayhi方法中使用的「name」變數,自然就是son內部繼承自father的私有變數name了,也就是說私有變數可以被繼承?

不是的。

我們再看下一段**,我們在son的類中重寫一下sayhi方法。

class

father

}class

sonextends

father

}public

class

privatefieldtest

}

這裡,出現了編譯錯誤,即son類裡面並沒有繼承name.

我們看看錯誤的原因。

the field father.name is not visible
可以看見,編譯器自動認為,name是屬於father的,son內並沒有繼承。

那為什麼第一段**中,可以使用sayhi方法得到資料呢?

實際上,這樣解釋比較好:

「子類不能繼承父類的私有屬性,但如果子類中公有的方法影響到了父類的私有屬性,那麼私有屬性是能夠被子類使用的。」

這句話聽起來很拗口,但是實際情況確實也很拗口。

看如下**

class

father

public

void

sayhi()

}class

sonextends

father

public

class

privatefieldtest

}

執行結果是

my name is null

my name is null

my name is sam

my name is null

my name is sam

my name is tom

第一段結果,沒有變化。

第二段結果,對應的是我們使用setname方法改變了f1的name,所以f1對應的sayhi結果變成了sam。

第三段結果,對應的是我們使用setname方法改變了s1的name,所以s1對應的sayhi結果變成了tom。

由此我們可以看到,雖然子類不能繼承父類私有變數,但是還是可以通過公有方法使用私有變數。只是重寫函式的時候可能比較麻煩,所以要活用super。

以上為個人理解,有錯歡迎隨時**~

c 父類的私有成員能否繼承

1.子類可以間接訪問父類私有成員 父類的私有成員函式和私有成員變數一樣,只有該類內部的其他成員函式可以呼叫,對外是封蔽的。子類繼承了父類的共有函式,且父類的公有函式呼叫了其內部的私有函式,此時子類呼叫父類的公有函式便能訪問父類的私有成員函式了。include using namespace std ...

問題 C 子類能否訪問父類私有成員變數?

在此之前,需要先了解下c 的繼承機制。計算子類物件大小時,也將父類私有成員變數所佔大小計算在內,也就是說,子類繼承父類時,也將父類私有成員變數繼承了過來,只是對子類不可見,不可操作。可以做乙個實驗進行檢驗 pragma once class fclass include fclass.h fclas...

Python類的私有成員

usr bin env python coding utf8 python中類的成員函式 成員變數預設都是公開的 public 在python中定義私有成員只需要在變數名或函式名前加上 兩個下劃線 那麼這個函式或變數就變成私有的了。在內部,python使用一種name mangling技術,將 me...