2 -17 : staticメソッドのオーバーライド

staticメソッドのオーバーライド

メソッドをオーバーライドする際に static 属性が変更されているとコンパイルエラーとなる。

もし

class A {
static public void get() {}
}
class B extends A {
}
......
B.get();

というコードがあったとして、開発途中で

class B extends A {
public void get(){}
}

が追加できたとすると、
B.get();
は非staticメソッドのためコンパイルエラーになってしまう。
他にもいろいろ理由はあるだろうが、static 属性を変更してオーバーライドすることはできない。
また static メソッドを static メソッドでオーバーライドすることはできない。一見するとコンパイルは通るので見た目はオーバーライドしているように記述できるが、それぞれ全く別のメソッドとして存在することになる。

・オーバーライドメソッド作成時の注意点

* 1つのサブクラスで行えるオーバーライドは1回
* 対象メソッドと引数の型・数・順序・戻り型が全く同じでなければならない
* 引数の変数名は異なっても良い
* 対象メソッドで throw している Exception をthrowする必要はない
* staticメソッドはオーバーライドできない
* オーバーライドしたメソッド内から super.xxx() としてスーパークラスのメソッドにアクセスできる
* オーバーライドされるメソッドで宣言されていないチェック対象例外をスローしてはならない

[StaticOverWrite.java]
/**
* staticメソッドのオーバーライド
*/
class Japanese {
String hart = "super闘争心";
public static String getTamashii() {
return "super愛国心";
}

public String getHart() {
return hart;
}
}

public class StaticOverWrite extends Japanese {

// static メソッドを非staticメソッドで
// オーバーライド不可
// これは Japanese.getTamashii() という記述がエラーになるため
// public String getTamashii() { return "";} // コンパイルエラー

// staticメソッドをstaticメソッドで
// オーバーライド不可
// 形としては宣言できるがそれぞれ別のメソッドとして存在する
public static String getTamashii() { return "subclass愛国心";}
// public static String getTamashii() { return super.getTamashii();} // superは使えない

// 非staticメソッドをstaticメソッドで
// オーバーライド不可
// public static String getHart() { return "突撃";} // コンパイルエラー

// 非staticメソッドを非staticメソッドで
// オーバーライド可能
public String getHart() { return "subclass闘争心";}

public static void main(String[] args) {
System.out.println("static Japanese.getTamashii=" + Japanese.getTamashii());
System.out.println("static getTamashii=" + getTamashii());
System.out.println(" getHart=" + new StaticOverWrite().getHart());
}
}

[実行結果]
static Japanese.getTamashii=super愛国心
static getTamashii=subclass愛国心
getHart=subclass闘争心