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

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

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

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

Q&A

解決済

2回答

1886閲覧

super. が利用できる範囲について

KSS

総合スコア17

Java

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

0グッド

0クリップ

投稿2015/05/09 13:50

スーパークラスにて設定したメンバをサブクラスから呼び出し表示させたいのですが、どうもうまくいきません。(下記の処理では、メインクラス→サブクラスのpublicメソッド内にあるsuper.メンバ変数)

どなたかヒントを頂けませんでしょうか。
よろしくお願いします。

lang

1// メインクラス 2class Sample 3{ 4 public static void main(String[] args) 5 { 6 7 Car car = new Car(); 8 car.setCar(1,1.1); 9 car.show(); 10 11 RacingCar racingCar = new RacingCar(); 12 racingCar.showSub(); // サブクラスのメソッドにアクセス 13 14 } 15} 16 17 //スーパークラス 18 class Car 19 { 20 21 protected int num; 22 protected double gas; 23 24 public Car() 25 { 26 this.num = 0; 27 this.gas = 0.0; 28 } 29 public Car(String str) 30 { 31 System.out.println(str); 32 } 33 public void setCar (int n , double g) 34 { 35 this.num = n; 36 this.gas = g; 37 } 38 39 public void show () 40 { 41 System.out.println("スーパークラス/ナンバー:" +this.num + " ガソリン:" + this.gas + "/ "); 42 } 43 44} 45 46 // サブクラス 47class RacingCar extends Car 48{ 49 protected int course; 50 51 public RacingCar () 52 { 53 super("コンストラクタのオーバーロードで初期値になることを避けた"); 54 this.course = 0; 55 } 56 57 public void showSub () 58 { 59 System.out.println("サブクラス/ナンバー:" + super.num + " ガソリン:" + super.gas + "コース:" + this.course + "/ "); 60 } 61} 62 63 64

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

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

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

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

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

guest

回答2

0

実行結果が下記のようになる前提で回答します。

スーパークラス/ナンバー:1 ガソリン:1.1/ コンストラクタのオーバーロードで初期値になることを避けた サブクラス/ナンバー:0 ガソリン:0.0コース:0/

以下のコードでRacingCarクラス(サブクラス)をインスタンスを生成した時に
int型のフィールドnum,courseは0、double型のgasは0.0で初期化されます。

lang

1RacingCar racingCar = new RacingCar();

よって、showSub()メソッドを実行した結果は以下のようになります。

サブクラス/ナンバー:0 ガソリン:0.0コース:0/

以下のように修正すれば意図した挙動になると思いますが、如何でしょう。

lang

1// Car car = new Car(); 2// car.setCar(1,1.1); 3// car.show(); 4 5 RacingCar racingCar = new RacingCar(); 6 racingCar.setCar(1,1.1); // [追加]サブクラスのフィールドに値を設定 7 racingCar.showSub(); // サブクラスのメソッドにアクセス

投稿2015/05/09 14:10

z_a_ki3

総合スコア30

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

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

KSS

2015/05/09 14:16

z_a_ki3 様 コメントありがとうございます! 実行結果は、まさに z_a_ki3 様がおっしゃるとおりです。また指摘頂いたように修正したところ、うまく設定ができました! super. の使いどころがよくわからず大混乱しておりましたが、今回のエラーで利用範囲が少しわかったように思います。ありがとうございました!
KSS

2015/05/09 14:33

z_a_ki3 様 教えて頂いたリンク、非常にわかりやすかったです~!! これを見ていろいろと試してみます、ありがとうございました!
guest

0

ベストアンサー

何がどううまく行かないのかわからないのですが,
RacingCarのコンストラクタで"コンストラクタのオーバーロードで初期値になることを避けた"といっていますが,
結果的に避けられていません.
参照型のメンバ変数は,プリミティブ型なら0や0.0,参照型ならnullで自動的に初期化されます.
したがって,racingCarメンバのnumやgasも,スーパークラスのコンストラクタでの操作同様,0や0.0で初期化されています.

投稿2015/05/09 14:00

swordone

総合スコア20649

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

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

KSS

2015/05/09 14:09

swordone 様 コメントありがとうございます!サブクラスにてメンバが呼び出せない=初期化されてしまいうまくいかない、という意図で質問させて頂きました。質問の仕方がヘタですみません。 >オーバーロードで初期値になることを避けた"といっていますが,結果的に避けられていません. なるほど、てっきり避けているつもりでした。ということは、オブジェクト生成時点で全て初期化されてしまうので、再度設定しなおす必要があるということでしょうか。それとも変数の値を保持し続ける方法がありましたら、ぜひ教えて頂きたいです。
swordone

2015/05/09 14:13

ああ・・・ようやく何を考えているのかわかりました. あなたのコードにおいて,carとracingCarは”別のオブジェクト”です. それぞれがもつ変数の値は独立していて互いに干渉しませんし, 当然RacingCarをnewで生成しても前に作ったCarのオブジェクトの変数を引き継ぐということはありません.
KSS

2015/05/09 14:23

swordone 様 コメントありがとうございます! なるほど、継承しているからといってメンバが利用できるわけではなかったのですね。メソッドが利用できたので、てっきり変数も可能なのかと勘違いしてました。 丁寧なご回答で本当にたすかりました、ありがとうございます!
swordone

2015/05/09 14:26

いえ,メンバは利用できるのですよ. ただ,前に作ったcarの値を引き継ぐというわけではないのです. クラスを「設計図」とお考えください. その設計図をもとにnewでオブジェクトを作成しているのです. つまり,あなたのコードで言うcarとracingCarはそれぞれ別個にnumフィールドとgasフィールドを持っています. carのnum,gasを変更しても,新たに設計図を元にRacingCarオブジェクトを作成する際に,そのオブジェクトのnum,gasが0及び0.0で初期化されます.(当然,carに影響無し)
KSS

2015/05/09 14:43

swordone 様 やっと理解できました!変数自体は利用できて、値は引き継がれないということですね。だからsetCar()でセットする必要がある・・・と。 どうやら私は基本的な部分の解釈がずれたままsuper.を利用しようとしていました、ご指摘ありがとうございます。
swordone

2015/05/09 14:44

その辺,オブジェクト志向の基本的な部分になるのでがんばってくださいね.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問