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

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

ただいまの
回答率

91.36%

  • Java

    10492questions

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

javaのsuperクラスについて上手い使い方(かなり有効で意味のある使い方)をしているソースコードが書かれているサイトはありますか?

解決済

回答 3

投稿 2017/11/21 17:03

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

King_of_Flies

score 251

いろいろ調べてみてsuperクラスを継承した子クラスをインスタンス化すると、superクラスも呼び出せるようになるよ~的なことがわかりました。

オーバーライドもできるという事も含めてです。

ただ、それによって圧倒的にコードが良くなると思えるような例のソースコードに巡り合えておらず、どういう場合にどういう使い方をすればより有効的なのか?っていうところがいまだに呑み込めてません。

良いサイトがあれば教えていただきたいです。

以下、無視で構いません

興味本位なのですが、下記コードの場合どっちに値が格納されるのですか?

class Oya {
  int hoge = 1
}

class Test {
  int hoge = 2
}

class Ko extends Oya {
  Test super = new Test()
  super.hoge = 20 //どっちに格納される?オーバーライドしたOya?それともTest?
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • swordone

    2017/11/21 18:11

    そもそもsuperはキーワードなので、変数名に使えません。

    キャンセル

回答 3

+1

システム構築のためのフレームワークでは、基本的な枠組みを基底クラスとして用意しておいて、ユーザーの実装はそこから派生させて行う、というよな仕組みが一般的です。

例えば、Android開発でコアになるActivityクラスについても、

アクティビティを作成するには、Activity のサブクラス(またはその既存のサブクラス)を作成する必要があります。 

ということで、Activityクラスを継承したクラスに自分のコードを実装していきます。

投稿 2017/11/21 17:07

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

クラスとインスタンスの関係についての理解が不足しているような印象を受けます。

TestはOyaでもKoでもありませんし、Koでのsuper.hogeの記載は該当箇所にはできません。


追記:

よくあるサンプルはPersonとStudentを使った例でしょうか。
下記のような形で、親クラスのコンストラクタを呼ぶためにsuper()を使用することができます。
この例では共通するデータとして姓名を親クラスに持たせています。
挨拶をされる側にメソッドがあるため意味的には不適切ですが、スーパークラスとサブクラスで処理内容をオーバーライドにより分けることができます。

import java.util.*;

class Person {
   protected String lastName;
   protected String firstName;

   public Person(String lastName, String firstName) {
      this.lastName = lastName;
      this.firstName = firstName;
   }

   public void hello() {
      System.out.println(String.format("こんにちは、%sさん。", this));
   }

   @Override
   public String toString() {
      return String.format("%s %s", this.lastName, this.firstName);
   }
}

class Student extends Person {
   private int grade;

   public Student(String lastName, String firstName, int grade) {
      super(lastName, firstName);
      this.grade = grade;
   }

   @Override
   public void hello() {
      System.out.println(String.format("こんにちは、%d年生の%sさん。", this.grade, this.lastName));
   }
}

class Teacher extends Person {
   private List<Student> students;

   public Teacher(String lastName, String firstName) {
      super(lastName, firstName);
      this.students = new ArrayList<>();
   }

   public Teacher(String lastName, String firstName, List<Student> students) {
      super(lastName, firstName);
      this.students = students;
   }

   @Override
   public void hello() {
      System.out.println(String.format("こんにちは、%s先生。", this.lastName));
   }
}

public class Main {
   public static void main(String[] args) {
      List<Person> persons = new ArrayList<>();

      persons.add(new Person("山田", "太郎"));
      persons.add(new Student("鈴木", "次郎", 2));
      persons.add(new Teacher("佐藤", "花子"));

      for (Person p : persons) {
         System.out.println(p);
         p.hello();
      }
   }
}

/*
$ java Main
山田 太郎
こんにちは、山田 太郎さん。
鈴木 次郎
こんにちは、2年生の鈴木さん。
佐藤 花子
こんにちは、佐藤先生。
*/

投稿 2017/11/21 18:00

編集 2017/11/22 12:20

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/11/21 18:15

    そもそも、フィールドはオーバーライドされないですしねぇ。
    https://docs.oracle.com/javase/tutorial/java/IandI/hidevariables.html

    キャンセル

checkベストアンサー

-1

上記リンク先の私と回答は、インターフェイスについて書いたものですが、
抽象クラスについてもだいたい当てはまります。


ただ、インターフェイスと抽象クラスの大きな違いとして、
(Javaでは)インターフェイスは多重継承できるが、抽象クラスはできない、
というのがあります。結果、インターフェイスの方が使いやすいです。

上記の理由から、(Javaでの)継承は使い所が難しいので、多用しなくていいです。
たんに実装を再利用するための継承は、アンチパターンと言えると思います。
委譲とインターフェイスが使えないか、先に考えてください。

あえて継承するときにも、「is-a」関係になっているか、
さらに、その関係が永続的かどうか注意してください。

たとえば、フレームワークで利用者が拡張するために継承させる、
といった場合は使って構いません。継承関係がひっくり返らないからです。

しかしたとえば、ビジネスやゲームのソフトの仕様の場合は、
かんたんにひっくり返ることがあるので、注意してください。

投稿 2017/11/21 19:16

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

ただいまの回答率

91.36%

関連した質問

  • 解決済

    国旗を表示させたい(続き)

    前提・実現したいこと btn [0][1][2]をクリックすると、それに対応した国旗が表示されるようにしたい。 ソースコード import java.awt.*;   

  • 解決済

    多次元配列のforeach文の動きについて

    public class Arrayx3 { public static void main(String[] args) { //3次元配列の宣言

  • 解決済

    CloneNotSupportedExceptionの原因を知りたい

    Exception in thread "main" java.lang.CloneNotSupportedException: Test2 at java.lang.Objec

  • 解決済

    Java

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

  • 受付中

    java 進数

    javaです 「数」を表すNumberクラスを考える。Numberクラスを基底クラスとして定義し、整数に対し2進数、8進数、10進数、16進数の文字列を返すメソッドをもつ派生

  • 解決済

    Java言語のスコープについて

    Java言語のスコープについての質問です。 ある変数をコンストラクタ内で宣言したとして、他のメソッドからその変数を参照することは出来ないのでしょうか??また、メソッド内で宣言

  • 解決済

    JFrameでのJPanelの切り替えについて

    前提・実現したいこと (例)Java(UIはJFrame)でゲームを作っているのですが、JPanelの切り替えをJFrameで行おうとしています。 しかし、JPanelの切り替

  • 解決済

    thisの意味が分かりません。

    前提・実現したいこと プログラミング初心者です。 Javaで電卓を作っています。 コードの一番下の三行のthisというのは継承しているJFrameクラスのことを指しているのでしょう

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

  • Java

    10492questions

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

  • トップ
  • Javaに関する質問
  • javaのsuperクラスについて上手い使い方(かなり有効で意味のある使い方)をしているソースコードが書かれているサイトはありますか?