まえがき
昔、Java を読めないときに「いきなり Android のコード書いてやれ!」と思って、初期生成されたコードに大量にある @Override
が分からなくて萎えてやめたことがあった。
それがようやく入門書を読んで、@Override
の意味がわかったのでメモ。
生成されるのはこういうコード。
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
クラスでオーバーライドすることを意図している。(実際にはスペルミスによりオーバーライドできていない)。
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
を追加したものが以下。
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
についてめちゃくちゃ詳しいとかではないけれど、普通にわかりやすい。