Java
Android

Java の @Override って何だ

More than 1 year has 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 についてめちゃくちゃ詳しいとかではないけれど、普通にわかりやすい。