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

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

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

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

Q&A

解決済

4回答

5384閲覧

Javaでのsuper, thisについて

hogeshi_

総合スコア47

Java

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

0グッド

1クリップ

投稿2016/03/24 07:53

Javaでのsuperについて調べるとsuperはスーパークラス自身とかいてありましたが、これはsuperクラスのインスタンス、という意味ですか。それとも純粋にスーパークラス自体なのですか。
super自体はスーパークラスのインスタンス自体でなければ色々矛盾が出ると思うのですが、一体どちらなのですか

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

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

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

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

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

guest

回答4

0

ベストアンサー

Javaでのsuperについて調べるとsuperはスーパークラス自身とかいてありました

これはどこに書いてあったのでしょうか?
スーパークラス自身などという表現がそもそも誤りですので、この考え方はすぐに忘れてください。


ここでの super が提供しているのは、スコープです。
この super の意味を理解するには、スコープコンテキストという概念を知らねばそもそも説明ができませんので、もし知らないのであれば、まずはそちらを調べてください。
(もしくは、「どこがどう分からない」という再質問をください)


スコープやコンテキストを理解している、という前提で以下に説明を書きます。

まずそもそもこの使い方での super は、インスタンススコープでしか記述出来ません。
そのインスタンスの自分自身 (this) のスコープではなく、継承元クラス (super) のスコープで名前解決(メソッドやフィールドなど、アクセスするメンバを特定) するために用います。

質問に1つ1つ答えます。

これはsuperクラスのインスタンス、という意味ですか。

間違ってはいないですが勘違いしているようです。
あるクラスのインスタンスは、その super クラスのインスタンスでもあります。
別々のインスタンスではありません。

それとも純粋にスーパークラス自体なのですか。

違います。
ここでの super はあるコンテキストでの別スコープを提供します。
ぶっちゃけ親クラスにキャストしてメンバアクセスするだけです。

super自体はスーパークラスのインスタンス自体でなければ色々矛盾が出ると思うのですが

繰り返しですが、このコンテキストでのインスタンス (this) は最初からスーパークラスのインスタンス (super) なので、矛盾はありません。登場するインスタンスは 1 つです。別のインスタンスは出てきません。

一体どちらなのですか

どちらも正しくありません。
「superはスーパークラス自身」という誤って教えられた表現を前提にして 2 つの選択肢を導き出してしまったからです。
これは誤謬の一種です。誤った前提を元に考えを進めているため、絶対に答えに辿りつけません。
一刻も早くこれを捨て去って、改めて他の方の回答にも目を通してください。

投稿2016/03/25 14:20

編集2016/03/25 14:31
heignamerican

総合スコア94

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

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

hogeshi_

2016/03/25 16:16

詳しく説明していただいてありがとうございます どうやら間違った情報を得て曲解していたようです 理解できました。ありがとうございます
guest

0

正確に言うなら、「インスタンスのスーパークラスが管理する部分」とでも言いましょうか。
スーパークラスとサブクラスで同じメンバを持った場合、フィールドなら隠蔽され、メソッドならオーバーライドされて、いずれにせよ見えなくなります。その見えなくなった部分を使うためにsuperキーワードを使います。

このサイトが簡単な図での解説も入っていてわかりやすいのではないでしょうか。
9-3. 継承2 superとthis
9-4. 継承3 メソッドのオーバーライド

投稿2016/03/24 07:58

編集2016/03/25 14:36
swordone

総合スコア20651

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

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

hogeshi_

2016/03/24 13:05

「インスタンスの」とはサブクラスのインスタンスのことでしょうか?
swordone

2016/03/24 14:20

そうなります。そのインスタンスのスーパークラスの部分を指します。
Odacchi

2016/03/24 15:30

話を見ていると、 AというクラスとAを継承したBというクラスをつくって、 Bのインスタンスを生成したとき、AとBのインスタンスが作られるという認識の文脈に見受けられますね。 この場合、Bのインスタンスのみが作られます。
guest

0

言葉遊びのように感じますが、thisはsuperを継承しているインスタンスですので、thisはsuperに存在するメンバを含みますし。thisの型はsuperの型でもあります(superの型はthisの型ではないです)。

superクラスのメンバを明示的に利用したいとき(または、明示しないといけないとき)に使うものです。

詳細は、こちらを参考にどうぞ。


※追記

例として、Human(人間)とAnimal(動物)の関係を例えます。

HumanはAnimalですが、AnimalだからといってHumanであるとは限りませんよね。
ですので、HumanクラスはAnimalクラスを継承していたとします。

ここで、Humanクラスのインスタンスを1つ生成します。(Animalのインスタンスが別途生成されるわけではない)
このとき、HumanクラスがHumanクラスとして振る舞いたいのか、Animalクラスとして振る舞いたいのかによって、superとthisの使い分けをします。

投稿2016/03/24 08:09

編集2016/03/24 15:56
Odacchi

総合スコア907

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

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

hogeshi_

2016/03/25 03:09

具体的にsuperがなにかを知りたいだけです。 super.メソッド、super.フィールドでアクセスできるならsuperはオブジェクトじゃないとおかしいのではないでしょうか。オブジェクトでないならスーパークラスのメソッド、フィールドはstaticでないといけなくなってしまうと思うのです
guest

0

「super」を介してアクセスできるのは「スーパークラスの属性(メソッドなど)」です。
たとえば、

class SuperClass { String name; void setName(String name) { this.name = name; } String getName(){ return this.name; } }

とあるとき、

class SubClass extends SuperClass{ @Override void setName(String name){ super.setName(name + " extends SuperClass"); } }

などとやると、サブクラスのインスタンスからスーパークラスで定義したメソッドにアクセスできます。

投稿2016/03/24 08:03

tkturbo

総合スコア5572

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

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

hogeshi_

2016/03/24 11:53

superの使い方は分かっているのですが、super自体が何かしりたいのです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問