134
108

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Java の @Override って何だ

Last updated at Posted at 2014-12-08

まえがき

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

134
108
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
134
108

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?