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

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

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

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

Q&A

解決済

2回答

6630閲覧

フィールドで代入を行うとき、値を反映する場合(superで与えた引数)としない場合(newで与えた引数)の訳を理解したいです。

zoemond

総合スコア50

Java

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

0グッド

0クリップ

投稿2016/06/10 06:36

編集2016/06/10 06:40

#質問
フィールドの代入と、コンストラクタとインスタンス化の際の引数について質問します。
抽象化して質問するのが難しいので、いきなり例示します。
説明が下手ですみません。

下の例で、予想道理に出力が出ない理由が知りたいです。
new B(引数)の引数ではなく、super(引数)の引数が反映される理由はどのように考えればよいでしょうか。

クラスBに引数を反映させるとき、new で引数を与えることとsuperで引数を与えることの違いがわかりません。

どなたかご存知の方がいらっしゃいましたら教えていただきたいです。

java

1public class test { 2 public static void main(String[] args) { 3 new A().aMethod(); 4 } 5} 6 7class A extends B { 8 B b; 9 10 A() {//コンストラクタ 11 super(4); 12 b = new B(3); 13 } 14 15 void aMethod() { 16 System.out.println(b.bMethod()); 17 //4が出力される 18 //コンストラクタでnew B(3);としたので、3が出力されると予想したのに 19 } 20} 21 22class B { 23 private static int bField; 24 25 B(int bb) { 26 this.bField = bb; 27 } 28 29 //コンストラクタの外でフィールド変数を代入 30 private int bField2 = bField; 31 32 int bMethod() { 33 return bField2; 34 } 35} 36

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

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

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

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

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

guest

回答2

0

ベストアンサー

継承とか一切関係なく、

java

1public class Main { 2 public static void main(String[] args) { 3 B b1 = new B(1); 4 System.out.println(b1.bMethod()); // 0 5 B b2 = new B(2); 6 System.out.println(b2.bMethod()); // 1 7 B b3 = new B(3); 8 System.out.println(b3.bMethod()); // 2 9 B b4 = new B(4); 10 System.out.println(b4.bMethod()); // 3 11 } 12}

なぜこうなるかというと
Bのインスタンス化時に

java

1private int bField2 = bField;

が先に処理されて、その後、

java

1B(int bb) { 2 this.bField = bb; 3}

が処理されるからです。

要するに、この書き方だと、super()だろうがnew B()だろうが、
コンストラクタに与えた値のひとつ前が出てきます。(初回はデフォルト値:0)

投稿2016/06/10 07:38

編集2016/06/10 07:43
ozwk

総合スコア13521

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

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

zoemond

2016/06/10 07:46

なるほど! 解決しました。 継承の勉強をしたときにコンストラクタの呼び出され方を勉強したことを思い出しました。 実際のプログラムの中では全然思い出さなかったというか、思考が及んでいませんでした。 ありがとうございました。
ozwk

2016/06/10 07:53 編集

実際のプログラムでは、 こんなJAVA豆知識みたいな動きしている時点で設計おかしいと思いますので なるべくシンプルにした方がいいと思います。
guest

0

先にまとめておくと、
4をセットしたほうはaMethodの中ではthis.bMethod()でアクセスできます。
3をセットしたほうはaMethodの中ではthis.b.bMethod()でアクセスできます。

(以下、スーパークラスを「親」と書いています)

super(4)は自分自身の親、つまりthisの親に渡すもので、
Aクラスの親のBクラスのbField2フィールドに4がセットされます。

b = new B(3)というのは自分自身の親ではありません。自分自身と親子関係の無い別のインスタンスを生成しています。
Aクラスのbというフィールドのインスタンス中の、BクラスのbField2に3がセットされます。

投稿2016/06/10 07:21

argius

総合スコア9388

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

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

zoemond

2016/06/10 07:48

継承をなくしてたとき、new B(3)としても0なのはなぜかを考えていました。 ozwkさんの回答で解決しました。 いつも答えていただきありがとうございます。
argius

2016/06/10 08:22

なるほど。 ↓ここを見逃していました private static int bField; private int bField2 = bField; ozwkさんの書かれているように、 これはJava豆知識とかパズルとか認定試験向けのプログラムですね。 実際にはこういう分かりにくいコードは書いてはいけないという反面教師的な。 ozwkさんの実行結果を見てみるとまさにパズルといった感じです。 とくにstaticフィールドにthis.bFieldでアクセスするのは ひっかけ問題っぽくなっていますね。 (実際引っかかった)
ozwk

2016/06/10 08:29 編集

私も最初 「継承とフィールドにもたせているのをごっちゃにしてるな~」 ってな具合に引っかかりました。
argius

2016/06/10 08:41

ozwkさん でも気づかれたのですから、さすがですね! コード例も含めて明快でした。 (負け惜しみを承知で) 最初からパズルだと分かっていたら解けたはず...
zoemond

2016/06/13 10:38

何が問題かを理解しておらず混乱させてしまい申し訳ありませんでした・・・
argius

2016/06/13 10:44

これは明らかに質問文をちゃんと読んでいなかった私のミスです。 なので、zoemondさんは悪くありませんよ。 こちらこそ申し訳ありませんでした。 次からはちゃんと質問を注意深く読むようにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問