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

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

ただいまの
回答率

87.78%

java 継承 geter setter

解決済

回答 5

投稿

  • 評価
  • クリップ 0
  • VIEW 480

score 21

理解が進まず困っております。
以下のコードのような継承関係についてです。
メインクラスでサブクラスのインスタンスを生成。サブクラスはスーパークラスを継承しているのでサブクラスインスタンスからセッターメソッドを呼び出しても動く。ここまでは理解できます。この理解は間違ってないですよね?
そしてここでセッターに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());
  }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

checkベストアンサー

+1

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 が設定されるので、その値を
表示できます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/08/23 20:44

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

    キャンセル

+1

疑問1

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

疑問2

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

疑問3

public class SuperClass{
  private int num;
  public void setNum(int num){
    this.num = num;
  }
  public int getNum(){
    return this.num;
  }
}
public class SubClass extends SuperClass{
}
質問文のまま

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

>疑問①
>なぜ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 21:17 編集

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

    キャンセル

0

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

public class SuperClass{
private int num;

public class SubClass extends SuperClass{
private int num;

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る