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

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

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

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

Q&A

解決済

2回答

13639閲覧

変数のオーバーライドを理解したい

k499778

総合スコア599

Java

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

0グッド

0クリップ

投稿2017/05/17 23:11

現在JavaGoldの勉強をしています。

変数のオーバーライドについて教えてください。

以下リンクの7番の問題で変数に対してthisとsuperで呼び出しています。解答はCでどちらも同じ値が返ってくるのですが、この動きを理解したいです。
https://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage?page_id=303&p_certName=SQ1Z0_803&p_org_id=70&lang=JA

オーバーライドすることによりスーパークラスの変数typeはどう扱われるのでしょうか?

サブクラスとスーパークラスの両方に同じ変数を持つ(継承される)という状態になり、thisキーワードで呼び出した変数typeは自オブジェクト(サブクラス)の変数type、superキーワードで呼び出した変数typeはサブクラスの変数typeの値が出力されるという解釈で合っていますでしょうか?

ご指導ご鞭撻のほどよろしくお願い致します。

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

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

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

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

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

guest

回答2

0

変数はオーバーライドできません。
継承した場合、スーパークラスの変数はそのまま引き継ぎますが、
スーパークラスで宣言した変数と同じ名前の変数をサブクラスで宣言することができ、それらは共存します。
ただし、そうするとその名前を使用した際、サブクラスの変数なのかスーパークラスの変数なのか見分けがつかなくなります。
そこで、thisとsuperを使い、どちらの変数なのかを区別します。どちらも付いていない場合は、thisがついているものとして扱われます。

しかしこの問題ではサブクラスのほうでtype変数を宣言していないため、this.typeもsuper.typeも同じ変数を指します。そのため、goメソッドでのtypeの書き換えはスーパークラスにも影響します。そのあとthis.typeでもsuper.typeでも同じ変数を参照するため、同じ"c"が出力されるというわけです。

投稿2017/05/17 23:29

swordone

総合スコア20649

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

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

k499778

2017/05/17 23:37

回答ありがとうございます。 スーパークラスのフィールドはサブクラスに定義されていないとthisでもsuperでもスーパークラスのフィールドを見に行くのですね。 逆にサブクラスに同様のフィールドがあれば、キーワードが付いていなければthis、スーパークラスのを呼び出す際は明示的にsuperをつけるのですね。 勉強になりました。ありがとうございます。
guest

0

ベストアンサー

サブクラスのCougarの方にフィールドtypeの定義がありませんので、オーバーライドされていません

Cougar内からtypeにアクセスしても、親クラスのFelineで定義されたtypeフィールドにアクセスされます。もちろん、this.でもsuper.でも同じものです。

一方で、Cougar側でtypeを定義した場合には、スーパークラスの変数は隠蔽されてしまいますので、super.typeのようにして明示的に呼ぶ必要が出てきます(もっとも、明確な理由がない限りやるべきではないと思います)。

投稿2017/05/17 23:27

maisumakun

総合スコア145123

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

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

k499778

2017/05/17 23:35

回答ありがとうございます。 迅速に回答して頂きありがとうございました。精進致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問