2014年05月12日

【Java】オーバーライド時における、スーパークラスとサブクラスの参照変数について

日々勉強です(´・ω・`)
そんなJavaの勉強で判明した、または備忘録として残しておこうと思います。

今日は、オーバーライド時における
スーパークラスとサブクラスにおける参照変数の型についてまとめました。

javalogo.jpg

こんなソースがあるとします。

class Super01 {
 void temp(){
  System.out.println("スーパークラス");
 }
}

class Sub01 {
 void temp(){
  System.out.println("サブクラス");
 }
}

public class Test {
 public static void main(String[] args){
  // スーパークラスの参照変数
  Super01 ms1 = new Super01();
  // サブクラスの参照変数(型はスーパークラス)
  Super01 ms2 = new Sub01();
  ms1.temp();
  ms2.temp();
 }
}


サブクラスをインスタンス化しているところで、何故スーパークラスの型を指定出来るのか
というところで参考書には、下記の様なことを書かれています。

・コンパイルでソース解析を行うときは、参照変数の型(この場合、ms2の型であるSuper01)である
 スーパークラスの方を見ているので、その後で実行するtempメソッドがスーパークラスに存在する
 ことを確認している。(コンパイルエラーにならないのはこのため?)
⇒これを「静的リンク」と呼ぶ。

・プログラム実行時には、参照変数の中身(ここでは、サブクラスSub01)でメソッドの呼び出しを
 決定するため、Sub01クラスのtempメソッドが呼び出される。
⇒これを「動的リンク」と呼ぶ。


このため、スーパークラスの型にサブクラスの参照変数を入れても問題は無い。
そして、実行時にはサブクラスの参照変数にて実行される。

ただし、これはメソッドの場合だけ。
フィールドの場合は、通用しないので注意が必要。

以上。

posted by 除菌さん at 23:45 | Comment(0) | Java | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: