Edited at

Java の @Override って何だ

More than 3 years have passed since last update.


まえがき

昔、Java を読めないときに「いきなり Android のコード書いてやれ!」と思って、初期生成されたコードに大量にある @Override が分からなくて萎えてやめたことがあった。

それがようやく入門書を読んで、@Override の意味がわかったのでメモ。

生成されるのはこういうコード。


MainActivity.java

package com.example.sample;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}



オーバーライドしているよ、という注釈

「スーパークラスのメソッドをサブクラスで書きなおすこと」をオーバーライドという。

ずばり@Overrideとは、「このメソッドはオーバーライドしているよ」という注釈なのだ。

下記のコードでは、Object クラスのtoStringメソッドをMyClsクラスでオーバーライドすることを意図している。(実際にはスペルミスによりオーバーライドできていない)。


JaToStr.java

class MyCls {

String name;
int count;

// 意図的なスペルミス
public String toStrgin() {
return "MyCls: name=" + name + " count=" + count;
}
}

class JaToStr {
public static void main(String[] args) {
MyCls d = new MyCls();
d.name = "ABC";
d.count = 123;
System.out.println(d);
// 期待する出力=> MyCls: name=ABC count=123
// 実際の出力 => MyCls@<ハッシュ値>
}
}


@Override を記述することで、スペルミスや存在しないメソッドをオーバーライドしているという問題がすぐに明らかになる。

上のコードに@Override を追加したものが以下。


JaToStr.java

class MyCls {

String name;
int count;

// 意図的なスペルミス
@Override
public String toStrgin() {
return "MyCls: name=" + name + " count=" + count;
}
}

class JaToStr {
public static void main(String[] args) {
MyCls d = new MyCls();
d.name = "ABC";
d.count = 123;
System.out.println(d);
}
}


こうすることでコンパイル時にエラーが出力されて便利。

$ javac JaToStr.java

JaToStr.java:6: エラー: メソッドはスーパータイプのメソッドをオーバーライドまたは実装しません
@Override
^
エラー1個

つまり、@Override が付与されたメソッドは、「これはオーバーライドメソッドです。もしオーバーライドされていなければエラーを出力せよ。開発者さんもそういうことでよろしく。」という意味。書いていないことで、プログラムの動作に悪影響が出るなんてことはない。


誰でも書こう

少ない記述量で、コンパイラにとっても開発者にとっても有意となるものなので、誰でも書くべきといえる。

メソッドをオーバーライドする場合は、誰でも書こう。


読んだ本

Amazon.co.jp: 明快入門Java (林晴比古実用マスターシリーズ): 林 晴比古: 本

参考にした入門書。@Override についてめちゃくちゃ詳しいとかではないけれど、普通にわかりやすい。