Step By Step

20代会社員。人生を一歩ずつ、歩いています。

Java言語のオーバーロードとオーバーライド

書籍を読んでいるうちに少し混乱してきたのでちょっと整理。
混乱したのは、
1.オーバーロードとオーバーライドの定義
2.静的結合と動的結合
3.staticメソッドのオーバーライド?
がこんがらがっていたからだと思う。

オーバーロード
引数が異なるメソッドを定義すること。
呼び出しメソッドはコンパイル時に決定される
静的結合(static binding)または早期結合(early binding)という。
コンパイル時には呼び出し側コードで宣言された引数の型、もしくはメソッドの戻り値をキーとして実行するメソッドを探す。

『オーバーライド』
継承関係にあるクラス間でシグニチャが全く同じメソッドを定義すること。
呼び出しメソッドは実行時に決定される
動的結合。

基底クラス(スーパークラス)と派生クラス(サブクラス)で同じ名前のstaticメソッドが定義されているとする(※通常やらない書き方)

public class SuperClass{
  static void methodA(){
    System.out.println("Super");
  }
}
public class SubClass extends SuperClass{
  static void methodA(){
    System.out.println("Sub");
  }

  public static void main(String[] args){
    SuperClass sp = new SubClass();
    sp.methodA();
}

(Eclipse 4.2Junoでこの書き方をしたところ、staticメソッドはクラス名.メソッド名でアクセスするべき、みたいな警告文が表示される)
f:id:tempo96:20140308212332p:plain
実行結果

Super

staticメソッドをオーバーライドすることは隠蔽というらしい。
(そもそもstaticメソッドはクラス固有のメソッドなのでオーバーライドといわないみたい。単にstaticメソッドの隠蔽というのかも)

あるメソッドはまず所属クラスで定義されているものとして探される。

所属クラスに定義されていなかった場合、基底クラスに検索しにいく。

派生クラスと基底クラスで同名のメソッドが定義されていた場合、派生クラスのメソッドが実行されて、基底クラスのメソッドは実行されない様子から、基底クラスのメソッドが隠されたように振舞ったということで隠蔽というようだ。

インスタンスの型ではなく、宣言した変数の型で呼び出されるメソッドが決定される。


以下参考サイト
Javaの道:クラス(9.オーバーライドとオーバーロード)
[至急] javaのオーバーライドと再定義の違いは?「静的メソッドはオーバー... - Yahoo!知恵袋
いまさらですが、職業Javaプログラマーなら理解しておいてほしい「継承」の意味について - 達人プログラマーを目指して
Deep Side of Java〜Java 言語再入門 第2回 〜 オブジェクト指向に関する仕様

余談
オススメ技術本なんて観点もある。
自己流オブジェクト指向&Java参考書 『非』お勧め版 - カレーなる辛口Javaな転職日記