引数だけ異なって名前は同じメソッド

広告

メソッド名は、同じクラス内で既に定義されている他のメソッド名と同じ名前を付けることは出来ませんが、引数が異なる場合は同じ名前のメソッドを同じクラス内で定義することが出来ます。引数が異なるとは下記のようなことです。

class Television{
  private int channelNo;
  private String housouKyoku;

  public void setChannel(int newChannelNo){
    channelNo = newChannelNo;

    if (newChannelNo == 1){
      housouKyoku = "FujiTV";
    }else if(newChannelNo == 3){
      housouKyoku = "NHK";
    }
  }

  public void setChannel(String newHousouKyoku){
    housouKyoku = newHousouKyoku;

    if (newHousouKyoku.equals("FujiTV")){
      newChannelNo = 1;
    }else if(newHousouKyoku.equals("NHK")){
      newChannelNo = 3;
    }
  }
}

上記で「setChannel」メソッドは3つ定義されていますが、メソッドが呼び出された時に渡されてくる引数が最初のメソッドでは「int型」の値であるのに対して、2番目のメソッドでは「String型」です。このようにメソッド名は同じでも引数が異なる場合は同じメソッド名でメソッドを定義することができます。

このようにした場合、呼び出す時の引数の型によって、どちらのメソッドが呼ばれるかが決まります。

class ctest{
  public static void main(String args[]){
    Television tv1 = new Television();

    /* 引数がint型なので最初のメソッドが呼び出されます */
    tv1.setChannel(1);

    /* 引数がString型なので2番目のメソッドが呼び出されます */
    tv1.setChannel("NHK");
  }
}

class Television{
  private int channelNo;
  private String housouKyoku;

  public void setChannel(int newChannelNo){
    channelNo = newChannelNo;

    if (newChannelNo == 1){
      housouKyoku = "FujiTV";
    }else if(newChannelNo == 3){
      housouKyoku = "NHK";
    }
  }

  public void setChannel(String newHousouKyoku){
    housouKyoku = newHousouKyoku;

    if (newHousouKyoku.equals("FujiTV")){
      newChannelNo = 1;
    }else if(newHousouKyoku.equals("NHK")){
      newChannelNo = 3;
    }
  }
}

引数の型だけでなく、引数の個数なども含めて、引数の部分が異なっていれば同じ名前のメソッドが定義出来ます。注意頂きたい点としては、戻り値の型が異なるだけでは同じ名前のメソッドを定義することは出来ません。例えば下記のような記述は行えません。

class Television{
  private int channelNo;
  private String housouKyoku;

  public int setChannel(int newChannelNo){
    channelNo = newChannelNo;

    if (newChannelNo == 1){
      housouKyoku = "FujiTV";
    }else if(newChannelNo == 3){
      housouKyoku = "NHK";
    }

    return channelNo;
  }

  public String setChannel(int newChannelNo){
    channelNo = newChannelNo;

    if (newChannelNo == 1){
      housouKyoku = "FujiTV";
    }else if(newChannelNo == 3){
      housouKyoku = "NHK";
    }

    return housouKyoku;
  }
}

上記の場合は、戻り値の型は異なっていますが、引数の部分がまったく同じなので上記のような使い方は出来ません。

では一度サンプルで試しておきます。

ctest6.java

class ctest6{
  public static void main(String args[]){
    Television tv1 = new Television();

    tv1.setChannel(1);

    tv1.setChannel("NHK");
    tv1.setChannel(3, "NHK総合");
  }
}

class Television{
  private int channelNo;
  private String housouKyoku;

  public void setChannel(int newChannelNo){
    channelNo = newChannelNo;

    if (newChannelNo == 1){
      housouKyoku = "FujiTV";
    }else if(newChannelNo == 3){
      housouKyoku = "NHK";
    }

    System.out.println("チャンネルが変更されました");
    dispChannelInfo();
  }

  public void setChannel(String newHousouKyoku){
    housouKyoku = newHousouKyoku;

    if (newHousouKyoku.equals("FujiTV")){
      channelNo = 1;
    }else if(newHousouKyoku.equals("NHK")){
      channelNo = 3;
    }

    System.out.println("放送局が変更されました");
    dispChannelInfo();
  }

  public void setChannel(int newChannelNo, String newHousouKyoku){
    channelNo = newChannelNo;
    housouKyoku = newHousouKyoku;

    System.out.println("チャンネルと放送局が変更されました");
    dispChannelInfo();
  }

  private void dispChannelInfo(){
    System.out.println("チャンネルNoは" + channelNo);
    System.out.println("放送局は" + housouKyoku);
  }
}

実行した結果は下記のようになります。

p5

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)