する質問をすることでしか得られない、回答やアドバイスがある。現在Javaについて勉強しています。今回はその継承に関して、調べてもよくわからない点があったので質問させてください。見て頂きたいのは以下のコードです。}}このコードを実行すると、「Java」と表示されます。わからないのはsub.getName()です。super(name)はSuperクラスのコンストラクタを呼び出しているので、結果Superクラスの変数nameに実引数の"Java"が代入されているとわかります。sub.getName()という処理は、Superクラスから継承されたSubクラスのgetNameメソッドを呼び出すものです。SubクラスのgetNameメソッドが実行されて返すのはSubクラスの変数name(定義、継承していませんが)で、Superクラスの変数nameではないはずです。thisとは「自身のインスタンス」という意味で、この場合Subクラスのインスタンスを示すからです。それに子クラスからthisでアクセス出来たら他クラスからのアクセスを制限するprivateの意味が無いじゃないですか?よって本来はSubインスタンスの変数nameが見つからない旨のコンパイルエラーが起きると思うんです。僕にとっては異常なのですが。そこで考えられる可能性としては継承という行為は継承元から継承先に利用可能箇所を切り取って貼り付ける、みたいなものではなく、全てを内包するという意味。その上で利用可能箇所を利用可能にすることを継承と言うのかもしれません。どちらにしろこの場合Superクラスの全てのメンバ(private変数name,getNameメソッド)をSubクラスが保有し、そこから利用できるメンバ(getNameメソッド)だけを利用出来る。それらのメンバはSubクラスのメンバではあるが、厳密にはSubクラスに含まれるSuperクラスのメンバであって、Mainクラスからsub.getName()で呼び出した際の処理も、スーパークラス内で行われることに他ならない。したら一応筋は通る気がするのですが、初心者故間違っていないか心配です。どなたか僕の悩みを解決していただけないでしょうか?よろしくお願いします。追記7/7:プログラムコードを```で括ってないことについてご指摘くださりありがとうございます。この件は僕が無知であり、また配慮が足りていない証拠です。まことに申し訳ありませんでした。7/10:皆さんの回答は大変ためになりました。僕にとっては難しい内容で、考えるのはまだ早いのかな。今の段階では皆さんの回答を参考にし、なんとなくの理解に留めておきます。attachmentクリップ0気になる質問をクリップするクリップした質問は、後からいつでもマイページで確認できます。クリップした質問に回答があった際、通知やメールを受け取ることができます。自分も答えを知りたい質問者以外のユーザにも役立つ評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。質問の評価を上げたことを取り消します低評価-評価を下げられる数の上限に達しました評価を下げることができません1日5回まで評価を下げられます1日に1ユーザに対して2回まで評価を下げられます質問の評価を下げるteratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。コメントをしてください。送信する質問の評価を下げる機能の利用条件この機能を利用するためには、以下の事項を行う必要があります。13:19プログラムコードは```で囲ってください。(わからなければ質問編集画面でコード部分を選択し<code>ボタンを押してください)プログラムコードは```で囲ってください。14:40コードブロックは今からでも直せるので直しましょう。コードブロックは今からでも直せるので直しましょう。言葉だけでは難しいかもしれませんが、誤解を恐れず言うと「成り切り」の関係です。クラスに「成りきる」事になります。以下の様に書きかえて確認頂くと分かるかもしれません。呼び出している訳ではないという事です。実体というポリモーフィズムも一般的には「継承」と称される事がありますが、こちらは「委譲」と呼ばれます。さんが書いてくれたコード、これが委譲です。呼び出す様にお願いしている」わけです。ここが継承と委譲が区別される所です。フィールド参照も「成り切り」です。参照するとnameはSuperでprivateアクセスされますというエラーが出ます。指定した為にアクセス出来なかった事を意味します。コピーされた訳ではないという事です。許可出来る事はご存じかと思います。クラスにコピーされる様に見えるかもしれませんが、実際は独立したクラスとなっていて個々にアクセス可否できる関係にあります。これも以下のソースを実行してみると分かると思います。}}例外を吐いて死ぬコードですが、このスタックトレースを見て下さい。実行されている事になります。この様に、継承とは「成り切り」で考えると分かりやすいかと思います。それに子クラスからthisでアクセス出来たら他クラスからのアクセスを制限するprivateの意味が無いじゃないですか?よって本来はSubインスタンスの変数nameが見つからない旨のコンパイルエラーが起きると思うんです。見つからないのですが、フィールドやメソッドの区別なくそれを見える様にするのが継承になります。アクセス可否によりエラーとなる訳です。それらのメンバはSubクラスのメンバではあるが、厳密にはSubクラスに含まれるSuperクラスのメンバであって、Mainクラスからsub.getName()で呼び出した際の処理も、スーパークラス内で行われることに他ならない。間違いは無いと思いますが上記の「成りきり」で考えて頂くとその他についても分かりやすいかと思います。評価が高い回答ほどページの上位に表示されます。remove低評価0回答の評価を下げる下記のような回答は推奨されていません。評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。継承の際の動きが複数の例示を以て詳しく説明されていたという点に感謝し、ベストアンサーを差し上げたいと思います。回答ありがとうございました。継承の際の動きが複数の例示を以て詳しく説明されていたという点に感謝し、ベストアンサーを差し上げたいと思います。回答ありがとうございました。Superを日本語で表現するなら「SubはSuperです」となります。言えば「Subのインスタンスは同時にSuperのインスタンス」でもあります。SubがSuperのインスタンスであるための条件はなんでしょうか?基本的にそれは「Superのインスタンスに対して行えることはSubのインスタンスに対してもまた行える」ということを意味すると考えてよいと思います。継承という行為は継承元から継承先に利用可能箇所を切り取って貼り付ける、みたいなものではなく、全てを内包するという意味。考えてよいと思います。それらのメンバはSubクラスのメンバではあるが、厳密にはSubクラスに含まれるSuperクラスのメンバであって、Mainクラスからsub.getName()で呼び出した際の処理も、スーパークラス内で行われることに他ならない。スーパークラス内で行われていることに他ならないという表現は若干誤謬を含む可能性があると思います。sub.getName()はあくまでSubのインスタンス内で行われており、Superから引き継いだSubのgetNameが動いていると捉えても一向にかまわないです。(Javaの実装上はメソッドの実体はSuperにしかないですが、Super内部でメソッドが動いているというような捉え方よりはむしろ、SubのためにコピーされたgetNameがSubのインスタンスの元で動いていると捉えた方が本質を捉えやすい気がします。評価が高い回答ほどページの上位に表示されます。remove低評価0回答の評価を下げる下記のような回答は推奨されていません。評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。13:26KSwordOfHaste説明が丁寧で、すごく分かりやすかったです。ベストアンサーを差し上げられないことが無念です。回答ありがとうございました。説明が丁寧で、すごく分かりやすかったです。ベストアンサーを差し上げられないことが無念です。回答ありがとうございました。キャンセル完了するlink+1学生時代、人間とか車でよく例えられました。人(スーパークラス)男性(人クラスのサブクラス)女性(人クラスのサブクラス)とか車(スーパークラス)トラック(車クラスのサブクラス)バス(車クラスのサブクラス)とか。広瀬すずは女性クラスのインスタンスであり人クラスのインスタンスでもあるわけです。人クラスに歩く関数があるので、女性クラスのインスタンスも男性クラスのインスタンスも歩く関数を定義しなくても利用できるのです。評価が高い回答ほどページの上位に表示されます。remove低評価0回答の評価を下げる下記のような回答は推奨されていません。評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。回答ありがとうございました。回答ありがとうございました。キャンセル完了するlink+1つまりSubクラスのgetNameメソッドが~中略のコンパイルエラーが起きると思うんです。だいたい間違ってます。どちらにしろこの場合Superクラスの全てのメンバ~中略スーパークラス内で行われることに他ならない。7割くらいはあってると思います。}}実装しちゃうと、継承ではなくWrapperとかって言うはずなんですが、あくまでボクの中での、継承されているインスタンスの内部のイメージです。評価が高い回答ほどページの上位に表示されます。remove低評価0回答の評価を下げる下記のような回答は推奨されていません。評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。14:49説明の為に書いて頂いたコードだと思うのですが、これは「委譲」というまた異なるポリモーフィズムなのでちょっ回答としてはズレてしまったかもしれないです。説明の為に書いて頂いたコードだと思うのですが、これは「委譲」というまた異なるポリモーフィズムなのでちょっ回答としてはズレてしまったかもしれないです。15:08はい、あくまでイメージです。実装として考えると、継承とはかけ離れたコードです。継承することでSuperクラスのプライベート変数がアクセス可能と思っているようなので、アクセスが不可能なことをイメージしやすいかなと思いまして。はい、あくまでイメージです。実装として考えると、継承とはかけ離れたコードです。アクセスが不可能なことをイメージしやすいかなと思いまして。「イメージしやすい説明」を配慮してくださり、ありがとうございます。僕みたいな初心者にとってわかりやすいことを心掛けるのは難しいことだったと思います。回答ありがとうございました。「イメージしやすい説明」を配慮してくださり、ありがとうございます。僕みたいな初心者にとってわかりやすいことを心掛けるのは難しいことだったと思います。回答ありがとうございました。頂いたご意見への回答は行っておりません。