fc2ブログ
  • 館内放送 [ツイッター]

    キンコンカンコーン・・・うみゃーだよ。館内放送だみゃ。
    ・・・・・キンコンカンコーン・・・ブツ
  • 町内会からのお知らせ [相互RSS]

【技術部】Javaの仕様を総点検!!~ ポリモーフィズム編 ~ 【試験勉強のお供に】


※カテゴリー【技術部】は技術者向けの記事となります。

Java の仕様について総点検しましょう。
認定資格の受験勉強等にもお役立ていただけます。


今回は ポリモーフィズムについてです。


【目的】
Java ポリモーフィズムの仕様を理解する。



※当記事はJava7をベースにしております。異なるバージョンでは挙動が違う可能性がありますのでご注意ください。



変数の参照について

public class SuperClass {
  public String strValue = "Super";
}
public class SubClass  extends SuperClass  {
  public String strValue = "Sub";
}
public static void main(String[] args)
{
  SuperClass spCls = new SubClass();
  SubClass subCls = (SubClass)spcls;

  System.out.println( spCls.strValue );
  System.out.println( subCls.strValue );
}

出力結果
Super
Sub

解説
SuperClass型で宣言された場合、strValueを直接参照するとSuperClassのstrValueを使用する。
SubClass型で宣言された場合、strValueを直接参照するとSubClassのstrValueを使用する。



親クラスにしか定義されていないメソッドの実行について

public class SuperClass {
  public String strValue = "Super";
  public String getValue()
  {
    return strValue;
  }
}
public class SubClass  extends SuperClass  {
  public String strValue = "Sub";
}
public static void main(String[] args)
{
  SuperClass spCls = new SubClass();
  SubClass subCls = (SubClass)spcls;

  System.out.println( spCls.getValue() );
  System.out.println( subCls.getValue() );
}

出力結果
Super
Super

解説
親クラスにしか定義されていないメソッドを実行した場合、親クラスが保持している変数を利用することになる。



子クラスにも定義されているメソッドの実行について

public class SuperClass {
  public String strValue = "Super";
  public String getValue()
  {
    return strValue;
  }
}
public class SubClass  extends SuperClass  {
  public String strValue = "Sub";
  public String getValue()
  {
    return strValue;
  }
}
public static void main(String[] args)
{
  SuperClass spCls = new SubClass();
  SubClass subCls = (SubClass)spcls;

  System.out.println( spCls.getValue() );
  System.out.println( subCls.getValue() );
}

出力結果
Sub
Sub

解説
子クラスにも定義されている場合は子クラスのメソッドが実行される。変数も子クラスが保持しているものを利用する。



親クラスの変数を使用すると明示した場合

public class SuperClass {
  public String strValue = "Super";
  public String getValue()
  {
    return strValue;
  }
}
public class SubClass  extends SuperClass  {
  public String strValue = "Sub";
  public String getValue()
  {
    return super.strValue;
  }
}
public static void main(String[] args)
{
  SuperClass spCls = new SubClass();
  SubClass subCls = (SubClass)spcls;

  System.out.println( spCls.getValue() );
  System.out.println( subCls.getValue() );
}

出力結果
Super
Super

解説
変数やメソッドについて、super.を指定する(12行目)ことで親クラスのものを使用する。



アクセス修飾子について

public class SuperClass {
  public String strValue = "Super";
  public String getValue()
  {
    return strValue;
  }
}
public class SubClass  extends SuperClass  {
  protected String strValue = "Sub";
  protected String getValue()
  {
    return strValue;
  }
}

出力結果
10行目でコンパイルエラー

解説
子クラスがオーバーライドするメソッドについて、親よりもアクセスレベルの低いアクセス修飾子を指定することができない。
変数についてはその限りではない。



インターフェイス型で定義された変数からメソッド実行

public interface InterfaceClass {
  public String getValue();
}
public class SuperClass implements InterfaceClass {
  public String strValue = "Super";
  public String getValue()
  {
    return strValue;
  }
}
public class SubClass  extends SuperClass  {
  public String strValue = "Sub";
  public String getValue()
  {
    return strValue;
  }
}
public static void main(String[] args)
{
  InterfaceClass intCls = new SubClass();
  System.out.println( intCls.getValue() );
}

出力結果
Sub

解説
インターフェイス型で宣言された変数からメソッドを実行してもSubClassのメソッドが実行される。



ご質問、ご意見等ありましたら下記コメントにご投稿お願いいたします。
関連記事
この記事へのリアクション

コメントの投稿

非公開コメント




タグ:技術部Javaポリモーフィズム認定資格

プロフィール

うみゃー・アパカ

Author:うみゃー・アパカ
UMYA.net公式ブログです。
ツイッター:umya_net


リンクフリーです!
アドレス:http://umyanet.blog.fc2.com/

公式ホームページ

ラインスタンプ配信中!

リンク



スマホアプリ配信中

黄金疾走

スポンサード

人気商品

Powered by amaprop.net