Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

privateがサブクラスに継承されない理由

こんにちは。
private属性がサブクラスに継承されない理由は何なのでしょうか。
スーパークラスで使っている属性は、ほぼ間違いなくサブクラスでも利用すると思うのですが。
過去の質問を探してみたら私には見つからないのです。
間違っている事を言っていたら申し訳ないです。
Google検索ではどこも「private属性は継承されない」と判を押したかのように書いているのです。
全く納得できません。
ご回答を宜しくお願いいたします。

13

回答

84690

閲覧

13件の回答

評価

0

スーパークラスとサブクラスがあれば、サブクラスはサブクラス内部からしか参照できない情報隠蔽された属性は、普通必要ですよね。
それはスーパークラスから継承されるべきだと思うのです。

評価

0

>private属性がサブクラスに継承されない理由は何なのでしょうか。
「親の個室にあるものを、なんで子供の自分が知らないのか?」
というのは、どうでしょうか。いまいちうまくないたとえかも知れませんが。
あなたには、親の持っているものをすべて知る権利がありますか?

サブクラスに継承されないようにするための属性が、privateです。
サブクラスでも使っていいという場合はprotected属性を使います。

なんでもそうですが、まず「こうしたい」という希望や理由があって、機能ができます。
機能だけを見て「なんでこうなるのか?」と考えてみても、答えは見つかりません。

評価

0

>private
英和辞書でも引いて言葉の意味を理解してみるとか

>ほぼ間違いなく
"絶対ではない"という認識はあるみたいだけど・・

>どこも「private属性は継承されない」と判を押したかのように書いているのです。
そうだから、そう書いてある
しかし、どんな書き方をしているもの・・ばかり・・を読んだのか判らないけど、それで終わっているところはあったとしても極々僅かではないかと思う

>サブクラスはサブクラス内部からしか参照できない情報隠蔽された属性は、普通必要ですよね。
じゃあ、そのサブクラス自身で宣言された自身でしか参照できない情報隠蔽された属性は?

>それはスーパークラスから継承されるべきだと思うのです。
先と同様にサブクラスに対して隠蔽したい属性は?

評価

0

>mioさん
話逸れるけど、昨日こんなのありました

# private
# 同じクラス内からしか呼び出せないが、
# 同じクラスから作られたオブジェクト同士であれば、
# 相互のprivateメンバーにアクセスできる。

変?

評価

0

># 同じクラスから作られたオブジェクト同士であれば、
># 相互のprivateメンバーにアクセスできる。
public String(String)なんか、典型的な例ですね(ソースを見なければ分からないけど)。
ソースを読んでいて、「あ、そうなんだ」と思ったものです。

この仕様の直接的な存在理由は、知りません。
大元のprivateの意味からすると変な気もしますが、実装上都合がいいから、でしょうかねえ…。

評価

0

コピーコンストラクタのためでしょうね。
cloneでもいいんでしょうけど。

評価

0

なるほど

その一文からだと、一瞬「?」になったけど
"そのクラス内で扱う分には、相互に"
って感じなのね

評価

0

>コピーコンストラクタのためでしょうね。
なるほど、そういう名前なんですね。
ぐぐってみると「C++で良く使われる」…C++は使っていたけど、たぶんこういう実装を作ったことはないです(^_^;
今まで作ってきたものは、おそらくみんなclone形式でしたねえ…。

評価

0

そう言われれば、私はcloneよりコピーコンストラクタの方が多かったかなぁ。。。
とか言ってても仕方ないですが(^^;

なんか、そんな深く意識せず定石的に使ってしまってたような・・(--;

評価

0

ご回答ありがとう御座います。

まあ様

>>サブクラスはサブクラス内部からしか参照できない情報隠蔽された属性は、普通必要ですよね。
>じゃあ、そのサブクラス自身で宣言された自身でしか参照できない情報隠蔽された属性は?

そのサブクラスのサブクラスには継承されるべきではないかと思うのです。

># private
># 同じクラス内からしか呼び出せないが、
># 同じクラスから作られたオブジェクト同士であれば、
># 相互のprivateメンバーにアクセスできる。

これは、私はprivate属性にはアクセスできないものだと思います。

操作は継承されるのに、その操作で使用される属性が継承されないのは困ります。

mio様

>サブクラスに継承されないようにするための属性が、privateです。
>サブクラスでも使っていいという場合はprotected属性を使います。

private属性は他インスタンスからアクセスできないという意味であり、継承できないという意味ではないと思います。

評価

0

自分で「こうだ」と決めてかかっている人には、説明のしようがありません。

評価

0

こうだと思う理由は以下の通りなのです。

>操作は継承されるのに、その操作で使用される属性が継承されないのは困ります。

理由を述べておりまして、決めてかかっているわけではありません。

なぜ継承されない方が道理だと思われるのですか?

評価

0

protectedやpublicのメソッドでprivateのフィールド・メソッドを使っている場合、参照しているであろう先が見えない、ということですか?
それでなぜ困るのかが、まず理解できません。
スーパークラスの独立性を維持するためには、privateメンバにはサブクラスからでも直接アクセスできないのは自然です。
まずフィールドについては、「フィールドに直接アクセスさせない」というオブジェクトの根本は、いいですか?

それから、ちょっとうまい例が思いつかなかったんですが、例えば、
private boolean isAAA = true;
public boolean isA() {
    return isAAA;
}
のisAAAの意味が逆になるとします。
多数のサブクラスや他のクラスがisA()メソッドを通して値を得ている場合と、isAAAフィールドを直接参照している場合とで、変更にかかるコストやリスクを、考えてみてください。

余談ですが、以下言語実装的な話。
そのクラスのフィールドやメソッドが参照される際、クラスのメンバーテーブルを参照します。
そこで、あるメンバが見つからなければ、次にスーパークラスのメンバーテーブルを参照し、そこでpublic/protectedとして見つかった同名のメンバにアクセスします。
つまり、サブクラスにはスーパークラスのフィールドやメソッドは、ありません。
言語実装上の継承は、スーパークラスのメンバーテーブルを参照した際に、同名のメソッドを使えることを意味します。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。