質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.49%
Java

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

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

Q&A

解決済

5回答

1520閲覧

java 継承 geter setter

tmp0

総合スコア21

Java

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

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

0グッド

0クリップ

投稿2020/08/23 11:33

理解が進まず困っております。
以下のコードのような継承関係についてです。
メインクラスでサブクラスのインスタンスを生成。サブクラスはスーパークラスを継承しているのでサブクラスインスタンスからセッターメソッドを呼び出しても動く。ここまでは理解できます。この理解は間違ってないですよね?
そしてここでセッターに10を代入しています。しかし結果は0が表示される。
疑問①
なぜ10ではなく0が表示されるのか。
疑問②
getterメソッドは表示するためだけのものと考えてよろしいでしょうか。
疑問③
では10と表示させるにはどうしたら表示できるのか。

どうかお知恵をお貸しください。よろしくお願いします。

コード1 public class SuperClass{ private int num; public void setNum(int num){ this.num = num; } } コード2 public class SubClass extends SuperClass{ private int num; public int getNum(){ return this.num; } } コード3 public class Main { public static void main(String[] args){ SubClass sub = new SubClass(); sub.setNum(10); System.out.println(sub.getNum()); } }

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

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

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

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

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

guest

回答5

0

ベストアンサー

SubClass は SuperClass を継承しているので、
SuperClass のメンバ(フィールドとメソッド)をすべて持っています。
public や private はアクセス指定子ですから、private である
SuperClass の num は SubClass からはアクセスできません。

(1)
SuperClass の setNum は SuperClass の num に値をセットし、
SubClass の getNum は SubClass の num の値を取得するので、0 です。

(3)
SuperClass に public int getNumum() { return this.num; } を追加し、
SubClass で、System.out.println(((SuperClass)sub).getNum());
実行すれば、SuperClass の num の値を表示できます。

あるいは、
SubClass に public void setNum(int num) { this.num = num; } を追加すれば、
sub.setNum(10); で SubClass の num に 10 が設定されるので、その値を
表示できます。

投稿2020/08/24 01:49

kazuma-s

総合スコア8224

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

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

0

>疑問①
>なぜ10ではなく0が表示されるのか。

sub.setNum(10);でセットしているのはSuperClassのnum

System.out.println(sub.getNum());でゲットしているのは、SubClassのnum
(subClassのnumにはまだ値を設定していないので、Java言語の仕様としての
初期値0になっている。

>疑問②
>getterメソッドは表示するためだけのものと考えてよろしいでしょうか。

表示ではなく、値の取得が目的です。
(値を取得したあとに、表示するかどうかは、また別の話です)

>疑問③
>では10と表示させるにはどうしたら表示できるのか。

class SubClass extends SuperClass{ //private int num; public int getNum(){ //return this.num; return num; // SuperClassのnumを返す } }

実装したいのは、こういうことでしょうかね。

投稿2020/08/23 11:47

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

javahack

2020/08/24 02:11 編集

コードを読み間違えていたので削除します。すみませんでした。
guest

0

疑問1

SubClassで int numが宣言されており、setNum(int) は SubClassに宣言されたnumに値をセットしているので、SuperClassの int num は 0のままなので、0が表示されています。

疑問2

getterは、値を返すだけのメソッドです。

疑問3

SuperClass

1public class SuperClass{ 2 private int num; 3 public void setNum(int num){ 4 this.num = num; 5 } 6 public int getNum(){ 7 return this.num; 8 } 9}

SubClass

1public class SubClass extends SuperClass{ 2}

Main

1質問文のまま

投稿2020/08/23 11:46

編集2020/08/23 11:50
YakumoSaki

総合スコア2027

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

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

0

privateな変数はたとえ継承先であっても参照できません

public class SuperClass{

private int num;

public class SubClass extends SuperClass{

private int num;

のnumは別の変数となります

投稿2020/08/23 11:42

y_waiwai

総合スコア87747

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

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

0

インスタンス変数がprivateとなっている以上、これは継承されませんSuperClass.numSubClass.numが別々に存在する状態となっています。

投稿2020/08/23 11:40

maisumakun

総合スコア145183

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

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

maisumakun

2020/08/23 11:44

継承先で使いたのであれば、numをprotected以上の可視性で宣言する必要があります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問