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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Java

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

Q&A

解決済

1回答

1022閲覧

RubyとJavaのsuperの違い

ifaoerij

総合スコア34

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Java

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

0グッド

1クリップ

投稿2019/11/29 01:27

Java経験者です。最近Rubyをさわってみたのですが、super()、super の挙動がjavaと異なる気がしています。
調べてもなかなかしっくりきていないのて質問させて頂きました。

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

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

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

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

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

maisumakun

2019/11/29 01:28

具体的に、どのあたりが異なると感じたのでしょうか。
m.ts10806

2019/11/29 01:37

しっくりきてないということは何かしら調べて試してきたはずですよね。 ご自身がもっている知見や考え、元となる出典を明記してください
m.ts10806

2019/11/29 01:38

ただ「気がする」も何も、コードは書いた通りにしか動かないので、言語仕様通りの挙動としか言えないと思いますが。
quickquip

2019/11/29 01:39

むしろ「全く異なる」のでどういう質問なのかわからない感じです。
quickquip

2019/11/29 01:59

super() と書いてあるということは、Javaに現れるsuperの中でも「コンストラクタ中で使うsuper」に対象を絞って比較をしていますか?
ifaoerij

2019/11/29 03:01

皆さまご返信ありがとうございます。 夜に一度に整理して、改めてご質問させていただきます
m.ts10806

2019/11/29 03:35

質問は編集できますのでこの質問を加筆修正してくださいね
ifaoerij

2019/11/30 14:56

みなさまありがとうございます。 解決いたしました。
guest

回答1

0

ベストアンサー

違うよ、全然違うよ。

Javaのsuperはthisに対するスーパー

superは親クラスの機能を使いたいときにthisの代わりに使います。thisはそのオブジェクト自身です。そしてsuperは端的に言うと「もし、今のクラスでなくて、親クラスのインスタンスとして作られた場合の振る舞いをするthis」です。

例えばコンストラクタで、オーバーロードした現在のクラスの別のコンストラクタを呼び出す時にthis(arg)と書くのと同じように、親クラスのコンストラクタを呼び出す時はsuper(arg)と書きます。自オブジェクトについて現在のクラスのインスタンスメソッドを呼び出す時にthis.method(arg)と書くのと同じように、親クラスのメソッドを呼び出す時はsuper.method(arg)と書きます。つまりは、thisの代わりにsuperを使うと、あたかも親クラスでthisと書いているときと同じようになると言うことです。

ただし、例外的にthisには無い書き方として、クラス名.superという書き方もできます。また、同じdefaultメソッドを持つインターフェースを多重継承した場合の曖昧さ回避のためにインターフェース名.superという書き方もあります。

Rubyのsuperはメソッドに対するスーパー

対して、Rubyのsuperは「親クラスにある同名のメソッドを呼び出すメソッド」です。つまり、メソッドを書く代わりにsuperを使うと言うことになります。super自体がメソッド呼び出しであり、self(RubyにおけるJavaのthis相当)を置き換えるものではありません。なので、Javaのsuperとは違って、今動作しているメソッドと同じ名前のメソッドしか呼び出せません。親クラスにある上書きされた別のメソッドを呼び出したい場合は、上書き前に別名を付けておくなど別のアプローチを用いる必要があります。

注意して欲しいのは、initializeのおいてはJavaのコンストラクタと似たような書き方になりますが、意味が全く違うということです。Rubyのinitializeはコンストラクタではありません。コンストラクタに相当するものはクラスメソッドになっているnewであり、newのデフォルトの動作として、オブジェクト生成(Class#allocate)後にinitializeを呼び出すと言うだけにすぎません。つまり、initializeは他と同じようにただのインスタンスメソッドに過ぎないと言うことです。なので、単にsuperと書いた場合、親クラスのinitializeを呼び出すという動作になるということです。

その他の言語

  • C++: 多重継承するため親クラスを一意に決められないためか、superに相当する物はありません。クラス名を指定して呼び出す必要があります。
  • JavaScript(ECMAScript): Javaとほぼ同じくsuperを使い、動作もほぼ同じです。
  • C#: baseというキーワードを使いますが、動作はJavaとほぼ同じです。
  • Python: super()という組込関数を用いた方法を使っています。super()はJavaのsuperのようなオブジェクトを返す関数であり、Javaと似たような動作になります。ただし、Pytonの__init__()はRubyと同じくコンストラクタでは無く、オブジェクト作成時に呼び出されるメソッドに過ぎないため、Javaのコンストラクタのような書き方はできず、通常のメソッドにおける親クラスのメソッド呼び出しのような書き方になります。PythonはC++と同じく多重継承ですが、順番に見に行くルールが決まっているため、C++のような問題は起きません。

投稿2019/11/29 12:59

raccy

総合スコア21735

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問