違うよ、全然違うよ。
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++のような問題は起きません。