こんにちは。現在Javaについて勉強しています。
今回はその継承に関して、調べてもよくわからない点があったので質問させてください。
見て頂きたいのは以下のコードです。
Java
1class Super{ 2 3 private String name; 4 5 publuc Super(String name){ 6 this.name=name; 7 } 8 9 public String getName(){ 10 return this.name; 11 } 12} 13 14class Sub extends Super{ 15 16 public Sub(String name){ 17 super(name); 18 } 19} 20 21public class Main{ 22 23 public static void main(String[] args){ 24 25 Sub sub=new Sub("Java"); 26 27 System.out.println 28 (sub.getName()); 29 } 30}
このコードを実行すると、「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:皆さんの回答は大変ためになりました。
ただ僕にとっては難しい内容で、考えるのはまだ早いのかな。と思いました。
なので今の段階では皆さんの回答を参考にし、なんとなくの理解に留めておきます。
回答4件
あなたの回答
tips
プレビュー