Javaでのsuperについて調べるとsuperはスーパークラス自身とかいてありましたが、これはsuperクラスのインスタンス、という意味ですか。それとも純粋にスーパークラス自体なのですか。
super自体はスーパークラスのインスタンス自体でなければ色々矛盾が出ると思うのですが、一体どちらなのですか
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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総合スコア94
0
正確に言うなら、「インスタンスのスーパークラスが管理する部分」とでも言いましょうか。
スーパークラスとサブクラスで同じメンバを持った場合、フィールドなら隠蔽され、メソッドならオーバーライドされて、いずれにせよ見えなくなります。その見えなくなった部分を使うためにsuperキーワードを使います。
このサイトが簡単な図での解説も入っていてわかりやすいのではないでしょうか。
9-3. 継承2 superとthis
9-4. 継承3 メソッドのオーバーライド
投稿2016/03/24 07:58
編集2016/03/25 14:36総合スコア20651
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総合スコア907
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
総合スコア5572
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/03/25 16:16