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

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

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

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

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

Q&A

解決済

2回答

1160閲覧

java ポリモーフィズム

tmp0

総合スコア21

Java

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

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

0グッド

0クリップ

投稿2020/08/19 05:46

ポリモーフィズムについてなかなか理解が進みません。コンストラクタ、has-aの関係、インスタンスの生成など色々盛り沢山で混乱しています。(盛り沢山なのは当たり前なのでしょうが、、、)
以下のコードがあります。
混乱部分①
private A aはフィールド宣言+このクラスでしか使えない。
それをコンストラクタの引数に渡している?どうゆうこと?となっています。

コード5
Sample s = new Sample(new B());
この(new B());とあります。問題集の解説をみるとSampleインスタンスの生成に続いてBのインスタンスを生成と書いてあります。こんなインスタンスの生成の仕方あるの?と混乱しています。

そもそもこのコードはどのような目的のコードなのか理解に苦しんでいます。
何かアドバイスがいただければ幸いです。
混乱で自分自身が何の理解に苦しんでいるのかもわからなくなっています。
引っかかっているのはコード1の
private A a;
public Sample(A a){
this.a = a;
この3行の意味が知りたいです。

コード1 public class Sample { private A a; public Sample(A a){ this.a = a; } public void method(){ a.test(); } } コード2 ublic class A { public void test(){ System.out.println("A"); } } コード3 public class B extends A{ public void test(){ System.out.println("B"); } } コード4 public class C extends A{ public void test(){ System.out.println("C"); } } コード5 public class Main { public static void main(String[] args){ Sample s = new Sample(new B()); s.method(); } }

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

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

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

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

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

guest

回答2

0

混乱部分1

private A aはフィールド宣言+このクラスでしか使えない。
それをコンストラクタの引数に渡している?どうゆうこと?となっています。

認識が、そもそも違います。
3の部分を見ればわかると思います

混乱部分2

こんなインスタンスの生成の仕方あるの?と混乱しています。

はい。あります。

冗長に書くなら

java

1A tmp = new B(); 2Sample s = new Sample(tmp);

混乱部分3

そもそもこのコードはどのような目的のコードなのか(中略)
この3行の意味が知りたいです。

目的は、本来は他人がわかるものでないですが
おそらく、以下のnew B()の部分を、new C()new A()にしたさいに
s.method()の表示内容が異なる(ポリモーフィズム)の確認だろうと思います。

java

1Sample s = new Sample(new B()); 2s.method();

そもそもの3行の意味ですが、フィールドの定義とコンストラクタの定義および
コンストラクタでの値の保存となります。
フィールド名とコンストラクタの仮引数名が同じ名前で、混乱しているのと思いますが
名前を変えれば理解できると思います。

java

1public class Sample { 2 private A hozon; 3 public Sample(A kariHikisu){ 4 hozon = kariHikisu; 5 } 6 public void method(){ 7 hozon.test(); 8 } 9}

Sampleクラスが、あまり役に立っていなくて(教本の後の方で意味がわかるかもしれませんが)

単純にA,B,Cだけ使うなら

java

1A[] sample = {new A(), new B(), new C()}; 2 3int i = 0; 4sample[i++].test(); // A 5sample[i++].test(); // B 6sample[i++].test(); // C

で、十分かなぁ。
ポイントは、Aという型で継承しているBもCも同じ配列で扱えるということ
メソッド名は同じなので、まったく同じコードで挙動の異なる振る舞いが実現できる。
※上記では3回呼び出してますがforループで書けます


こんなインスタンスの生成の仕方あるの?と混乱しています。

インスタンスを後で使わないなら以下ように書くこともあります。

java

1new Sample(new A()).method(); // A 2new Sample(new B()).method(); // B 3new Sample(new C()).method(); // C

投稿2020/08/19 06:06

編集2020/08/19 06:28
momon-ga

総合スコア4820

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

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

tmp0

2020/08/20 12:37

回答ありがとうございました。とても丁寧にわかりやすく教えて頂き感動です。
guest

0

ベストアンサー

混乱部分①

private A aはフィールド宣言+このクラスでしか使えない。
それをコンストラクタの引数に渡している?どうゆうこと?となっています。

まず、private A aはフィールド宣言+このクラスでしか使えない。
この認識は合っています。

では、public Sample(A a) のAはなんなのか?
おっしゃる通り、これはコンストラクタですが、コンストラクタは分かっていますか?
インスタンスを作成時に呼び出される部分ですね。

Java

1A a = new A(); 2Sample sample = new Sample(a); // このnew Sample(a)の時に走る部分です。

このコンストラクタのA aは、このコンストラクタ内だけで使える変数ということになります。
そして、大事なのはコンストラクタ内でのaという記述は、コンストラクタの引数で宣言されているaを指す!
ってことです。

JavaScript

1public class Sample { 2 // このaはSampleクラス内でどこでも使える 3 private A a; 4 public Sample(A a){ 5 // コンストラクタの引数で宣言されているaはこの中でしか使えない 6 // この中でaと書いたら、フィールドのaではなく引数のaになる 7 } 8}

これを、変数のスコープと言います。
フィールドのaの方が使える範囲が広いのでスコープが広いということになります。

これらを踏まえて、ちょっと変数名を変えてみましょうか。

Java

1public class Sample { 2 private A a1; 3 public Sample(A a2){ 4 a1 = a2; 5 } 6}

上記は理解できるでしょうか?
これは、直す前のコードと同じことをしています。

次は元のコードからthisをとってみます。

Java

1public class Sample { 2 private A a; 3 public Sample(A a){ 4 a = a; 5 } 6}

これはおかしいです。
なぜなら前述した通り、コンストラクタ内でのaは引数のaを指すので、
自分に自分を代入してることになります。
だから、このaはフィールドのaですっていうのを示すためにthisをつけているんです。
thisは自分自身のインスタンスという意味です。

Java

1public class Sample { 2 private A a; 3 public Sample(A a){ 4 // フィールドのaに、コンストラクタの引数のaを代入している。 5 // 引数のaは、new Sample(aのインスタンス) で呼び出された時に入る。 6 this.a = a; 7 } 8}

投稿2020/08/19 07:00

編集2020/08/19 07:01
root_jp

総合スコア4666

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

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

tmp0

2020/08/20 12:41

丁寧な回答ありがとうございました。塾の講師はだんだん高圧的になってきており、聞くのが億劫になってきていたところでしたので本当に助かります。こんな丁寧に教えていただける先生が良かったです笑 私の質問も悪いかも知れませんが質問をするといつも自分で考えろ。もっとわかりやすく質問しろ。勉強の仕方が間違っている。これはヤバイ。など言われています。こんな方ばかりしかいないのかと絶望していたところでした。
root_jp

2020/08/21 01:15

いえいえ、こちらとしても、変数のスコープの話だけで長くなってしまったので、肝心のポリモフィズムについての疑問には答えていないにも関わらず大変恐縮です。 こういうちょっとした事をスルーせずに疑問を持つ事は、プログラミングを勉強するうえで重要なので、 これからも続けてもらいです。 ポリモフィズムは難しいです。初学者ならばほぼ全員がぶち当たる壁だと言ってもいいです。 しかし、ものすごく大事な考え方なので、諦めずに食らいついてください。 分からなければ、今度はポリモフィズムだけに絞った質問をteratailにすればいいと思います。 きっと教えてくれますよ。 その塾の先生とやらはいただけないですねぇ。 指導者としてヤバイので、高いお金を払ってるならしっかりクレーム入れてもいいと思いますよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問