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

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

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

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Java

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

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

3回答

1753閲覧

Javaのクラスとインスタンスの動きがわかりません

Aya_nishimura

総合スコア16

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Java

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

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2020/05/15 04:51

以下コードについての質問です。クラスとインスタンスの動きが理解できません。

①についてです。
こちらがerrorになるのはなぜでしょうか?
変数hはSuperHeroクラスのインスタンス化しているので、
SuperHeroのメソッドが使えるのではないでしょうか?

②についてです。
逆にこちらが正しく出力される意味がわかりません。
型はインスタンスと必ず合わせる必要があるってことですかね?


こちらの出力結果が「ミナトは逃げ出した!」になる理由がわかりません。
・そもそもインスタンスを生成しただけで、Mainメソッドで変数nameを指定していないのになぜミナトとでるのか?
そもそもSuperHeroクラスのインスタンスなのに、なぜ継承先のnameが呼ばれるのか?
読み込み順は
「自分のクラス」 → なければ → 「親クラス」
ではないのでしょうか?

Mainメソッド(メインクラス)

public class Main { public static void main(String[] args) { Hero h = new SuperHero(); // ① h.fly(); SuperHero sh = new SuperHero(); // ② sh.fly(); sh.run(); ③ } }

ヒーロークラス

public class Hero { String name = "ミナト"; int hp = 100; // 戦う public void attack(Matango m) { System.out.println(this.name + "の攻撃!"); m.hp -= 5; System.out.println("5ポイントのダメージを与えた!"); } // 逃げる public void run() { System.out.println(this.name + "は逃げ出した"); } }

スーパーヒーロークラス

public class SuperHero extends Hero { String name = "コンマ"; int hp = 100; boolean filying; // 飛ぶ public void fly() { this.filying = true; System.out.println("飛び上がった!"); } // 着地 public void lang() { this.filying = false; System.out.println("着地した!"); } }

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

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

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

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

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

guest

回答3

0

いち
SuperHeroの型はあくまでSuperHeroです。


ただしくインスタンス化され、自身のメソッドを呼んでいますし、うまくいかない理由がありません。

さん
呼び出している自身だからです。

Heroにコンストラクタでsuper.nameを上書きするかHeroでrunをオーバーライドするかどちらかで対応します。

投稿2020/05/15 05:15

m.ts10806

総合スコア80854

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

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

0

変数hはSuperHeroクラスのインスタンス化しているので、

SuperHeroのメソッドが使えるのではないでしょうか?

使えません。Hero型の変数なので、Heroにあるものにしかアクセスできません。

逆にこちらが正しく出力される意味がわかりません。

何がわからないのかわかりません。SuperHero型にあるメソッドをSuperHero型の変数に対して使っているだけです。

型はインスタンスと必ず合わせる必要があるってことですかね?

必ずしもありません。

そもそもインスタンスを生成しただけで、Mainメソッドで変数nameを指定していないのに

インスタンス変数のthis.name"ミナト"です。

読み込み順は

「自分のクラス」 → なければ → 「親クラス」
ではないのでしょうか?

nameはアクセス制御子がない(package private)なので、このプロパティは継承されませんHeroから見たときのthis.name = "ミナト"SuperHeroから見たときはthis.name = "コンマ"です。

投稿2020/05/15 04:59

maisumakun

総合スコア145201

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

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

0

ベストアンサー

変数hはSuperHeroクラスのインスタンス化しているので、

SuperHeroのメソッドが使えるのではないでしょうか?

どのメソッドが呼び出せるかについては、変数の型に依存します。
実際に入っているオブジェクトには関係ありません。

: 処理の内容自体はオーバーライドの有無に依って変化し得ます。

型はインスタンスと必ず合わせる必要があるってことですかね?

いいえ。
flyメソッドを呼ぶためにSuperHero型の変数を用意する必要があるだけです。

そもそもインスタンスを生成しただけで、Mainメソッドで変数nameを指定していないのになぜミナトとでるのか?

nameの初期値が"ミナト"だからです。

そもそもSuperHeroクラスのインスタンスなのに、なぜ継承先のnameが呼ばれるのか?

呼び出されているメソッドがHeroのものだからです。

投稿2020/05/15 04:56

編集2020/05/15 05:08
LouiS0616

総合スコア35660

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

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

Aya_nishimura

2020/05/15 05:02

ありがとうございます。以下質問です。 仰られているオブジェクトとはインスタンスという認識でよろしいですか? > どのメソッドが呼び出せるかについては、変数の型に依存します。 実際に入っているオブジェクトには関係ありません。 # つまりインスタンス生成して、そのインスタンスにあるメソッドを使用したければ 代入する変数の型は、インスタンスのクラスに合わせる必要がある。 という事でしょうか? >いいえ。 flyメソッドを呼ぶためにSuperHero型の変数を用意する必要があるだけです。 # つまり、必ず使用したいクラスの型に合わせる必要があるという事でしょうか?
maisumakun

2020/05/15 05:05

どちらも「いいえ」です。親クラスやインターフェースから継承・オーバーライドしたメソッドしか使わないなら、その親クラスやインターフェースの型のまま使えます。
Aya_nishimura

2020/05/15 05:10

>その親クラスやインターフェースの型のまま使えます。 # すみません詳しくわかりませんでした。 親クラスの型をしていしてるのにerrorになるためです。 Hero h = new SuperHero(); // ① h.fly();
LouiS0616

2020/05/15 05:11

@nishimura_tochi さん maisumakunさんがコメントされていない一か所だけ。 > 仰られているオブジェクトとはインスタンスという認識でよろしいですか? 本回答では特に区別しておりませんので、置き換えて読んでも問題ありません。 --- @maisumakun さん コメントありがとうございます。
LouiS0616

2020/05/15 05:12

> 親クラスの型をしていしてるのにerrorになるためです。 Hero h = new SuperHero(); // ① h.fly(); Heroクラスにはflyメソッドが無いので、呼び出せません。 attackやrunならば呼び出せます。
maisumakun

2020/05/15 05:14

> 親クラスの型をしていしてるのにerrorになるためです。 「親クラスやインターフェースから継承・オーバーライドしたメソッドしか使わないなら」という条件を満たしていません。
Aya_nishimura

2020/05/15 05:16

LouiS0616さん ご回答ありがとうございます。 #Heroクラスにはflyメソッドが無いので、呼び出せません。 attackやrunならば呼び出せます。 > Hero h = new SuperHero(); // ① h.fly(); これはHeroクラスになるのでしょうか?SuperHeroクラスになると思っていました。
LouiS0616

2020/05/15 05:20

ややこしい話なんですが、変数とオブジェクトは別物です。 たとえオブジェクトがSuperHero型であろうと、変数がHero型ならばHero型が提供している機能しか使えません。
Aya_nishimura

2020/05/15 05:22

LouiS0616さん ありがとうございました。 復唱に近い形になり恐縮ですが、型名にあるメソッドしか扱えないという認識で大丈夫でしょうか?
LouiS0616

2020/05/15 05:25

そうですね。 敢えて細かいところをつつくとすれば、クラスとそのスーパークラスの提供するメソッドが利用できます。 Heroクラスの変数hからは、HeroクラスのそのスーパークラスであるObjectのメソッドしか使えません。 SuperHeroクラスの変数shからは、SuperHeroクラスとそのスーパークラスであるHeroと、さらにそのスーパークラスであるObjectのメソッドしか使えません。
Aya_nishimura

2020/05/15 05:27

LouiS0616さん ありがとうございます!理解できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問