🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

1844閲覧

サブクラスでインスタンス化した際のスーパークラスのメソッドの処理

yoz

総合スコア8

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2021/01/25 07:14

以下のコードの処理について質問です。

public class SuperClass{
private int num=10;
void test(){
System.out.println(num);
}
}

public class SubClass extends Superclass{
private int num=20;
public static void main(String[] args){
SubClass sub = new SubClass();
sub.test();
}
}

このコードでは、testメソッドはスーパークラスが所持しており、
SubClassクラスではsub変数をインスタンス化していると考えています。
sub.test()ではsub変数に代入されているnum=20で処理されると思いましたが、
実行するとスーパークラスのnum=10が表示されます。

ここで2つ疑問が発生しました。
①SubClass型でSubClassクラスをインスタンス化してsub変数に代入しているはずですが、
スーパークラスのprivateフィールドが代入されているのは何故でしょうか。
②privateフィールドはサブクラスからアクセスできるのでしょうか。
ご教授よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2021/01/26 02:28

質問に転記した際のミスだと思いますが、ご提示のコードはコンパイルエラーになります。 > public class SubClass extends Superclass{ 正: ... extends SuperClass 誤: ... extends Superclass
yoz

2021/01/26 03:53

失礼しました。 正しくは記載いただいた通りになります。
guest

回答2

0

スーパークラスとサブクラスでは、同名の変数が独立に存在できます。
SubClassでは、SuperClass#numとSubClass#numが独立に存在し、それぞれ10と20になっています。
SuperClass#testメソッドはSuperClass#numを参照しているので、当然10を表示します。

投稿2021/01/25 18:43

swordone

総合スコア20669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yoz

2021/01/26 01:25

SubClassは継承しているためSuperClassのnumと自身のnumのどちらも所持しているということでよいでしょうか。 どちらを使うかによって、num=10ならtestメソッドを呼び出すか、num=20ならsub.numで自身のnumフィールドを呼び出すか。 この認識で合っているでしょうか。
guest

0

ベストアンサー

2
できない
1
↑ので子クラスで別途使うため(どのような設計か分からないので「おそらく」)。オーバーライドとかで調べてください

実行するとスーパークラスのnum=10が表示されます。

親クラスのメソッド実行してれば、親クラスのフィールド参照しますよね。

投稿2021/01/25 07:20

編集2021/01/25 07:23
m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yoz

2021/01/25 07:50

ご回答ありがとうございます。 親クラスのメソッドを実行していますが、参照しているのはSubClassクラスのインスタンスだと考えております。そうするとメソッドのみ親クラスでインスタンスはサブクラスなので、そこに整合性はあるのでしょうか。
m.ts10806

2021/01/25 07:59

整合性ありますよ。 親クラスのメソッドを実行するので親クラスから可視である方のnumが参照されます。要はゲッターの概念です。 インスタンス化した自身のフィールドを見たいなら今のコードだと sub.numとなりますね。
m.ts10806

2021/01/25 08:00

継承に限らず、不可視フィールドを参照するために可視メソッドを通すのはよくある話です。
yoz

2021/01/26 01:21

ご回答ありがとうございます。 >インスタンス化した自身のフィールドを見たいなら今のコードだとsub.num ここで納得がいきました。sub.numにすることによって、subインスタンスが参照するnum、つまりSubClassのnum=20が表示されるということですね。 subインスタンスは親クラスの内容を継承しているので、sub.testメソッドが実行されれば親クラスのnumが参照される、sub.numが実行されれば自身のフィールドのnum=20が参照されるということであっていますでしょうか。 不可視フィールドとはこの場合親クラスのprivate int num=10、可視フィールドはvoid testメソッドのことでしょうか。
m.ts10806

2021/01/26 01:38

不可視→インスタンス自身から参照不可 可視→インスタンス自身から参照可能 >sub.testメソッドが実行されれば親クラスのnumが参照される、sub.numが実行されれば自身のフィールドのnum=20が参照される もうちょっとシンプルに、体系的に考えたほうが良いです。 testメソッドは親クラスが持ってるので親クラスのフィールドを参照してる(「明示しない限り」というのはつくけど) numフィールドはインスタンスした自身が持ってるのでそっちを見る。 試しにnumを両方publicにしてみてください。 さて、どうなるでしょう?(実行前に予想が立てられるようになると理解したと言えます)
yoz

2021/01/26 01:58

>試しにnumを両方publicにしてみてください 両方publicにしても、testメソッドを使用しているので親クラスの num=10が表示されるのではないでしょうか…?
m.ts10806

2021/01/26 02:01

sub.numのほうはどうなると思いますか?
yoz

2021/01/26 02:15

サブクラスが親クラス、自クラスの両方の値を所持しているので、どちらのint numを参照してよいかわからなくなり、コンパイルエラーが発生するのではないでしょうか。
m.ts10806

2021/01/26 02:21

では、やってみてください。 先んじて回答に書いておいま「オーバーライド」が意味を持ってくるはずです。
yoz

2021/01/26 02:58

現在は質問した時と異なる環境で、所用でJava開発環境が使えない状況にあるので、オンラインコンパイラで代用したところ、オンラインコンパイラ独特のエラーでハマってしまいました…。 申し訳ないですが答えを教えていただけると助かります。
m.ts10806

2021/01/26 03:19

理解を深めたいわけじゃなかったんですね。動かせばわかることに対してすぐ答えを求めるのはかなりの怠惰です。
yoz

2021/01/26 03:56

失礼しました。ご記載のようなご指摘を頂く覚悟で、現在の状況を説明いたしましたが、それでも気分を害されたことをお詫びいたします。せっかくご回答をいただいたのに、こちらの現在の環境が許さずご期待に沿えずに申し訳ございません。実行できる環境に戻りましたら、オンラインコンパイラではない環境で試してみます。ご回答ありがとうございました。大変参考になりました。
m.ts10806

2021/01/26 05:23

特に気分を害したわけではないですが、間違えないでもらいたいのは誰も急いでないという点です。 時間が多少かかろうと確実な理解が得られるのであれば回答者にとっては良いフィードバックを得られたということになります。(たまにほっといて次々いく人がいますが、そういう人は論外。回答者も把握するのでどんどんあたりは冷たくなります)
yoz

2021/01/26 07:16

標記の件、承知しました。ご丁寧な回答大変感謝いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問