publicとprivate

広告

前のページでメンバ変数に値を格納する場合にメソッドを呼び出して行う方法について記述しましたが、今のままではメンバ変数を変更するためのメソッドを用意したとしても、直接メンバ変数に値を格納しようと思えば出来てしまいます。

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

    tv1.setChanne(5);
  }
}

class Television{
  int channelNo;

  void setChannel(int newChannelNo){
    if ((newChannelNo == 1) || (newChannel == 3)){
      channelNo = newChannelNo;
    }
  }

  void dispChannel(){
    System.out.println("現在のチャンネルは " + channelNo + " です");
  }
}

では、メンバ変数に直接値を格納するのを禁止し、必ずメソッド経由でしかメンバ変数の値を格納したり参照したり出来ないようにするにはどうすればいいでしょうか。そういった場合はメンバ変数の定義をする時に先頭に「private」を付けるようにします。

class Television{
  private int channelNo;

  void setChannel(int newChannelNo){
    if ((newChannelNo == 1) || (newChannel == 3)){
      channelNo = newChannelNo;
    }
  }

  void dispChannel(){
    System.out.println("現在のチャンネルは " + channelNo + " です");
  }
}

「private」を頭に付けたメンバ変数は、メンバ変数が定義されているクラスの中でしか値を格納したり取り出したりということが出来なくなります。その為、他のクラスの中でオブジェクトを作成し「オブジェクト名.メンバ変数名 = 値」のように直接メンバ変数に値を格納することを防止できます。

「private」を付けた場合でも、同じクラス内のメソッドからは値を格納したり取り出したりを行えますので、他のクラスの中でオブジェクトを作成した場合でも、オブジェクトからはメソッドを呼び出し、メンバ変数の値の変更はそのメソッド内で行うように記述すれば、メソッドを呼び出すことで間接的にメンバ変数の格納や変更を行えます。つまりメンバ変数の直接の変更は禁止し、メソッド経由でのみメンバ変数の変更を許可出来るというわけです。

定義時にprivateを頭に付けたメンバ変数は、メンバ変数を定義したクラス内でし
かメンバ変数の値を変更したり参照したりする事は出来ない。

private 変数の型 メンバ変数名;

サンプルプログラム

実際に一度試してみましょう。「private」を付けたメンバ変数を直接変更してみます。

ctest2.java

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

    tv1.channelNo = 1;
  }
}

class Television{
  private int channelNo;

  void setChannel(int newChannelNo){
    channelNo = newChannelNo;
    System.out.println("新しいChannelNo=" + channelNo);
  }
}

上記を実行しようとすると、コンパイルの段階でエラーとなります。

p1

これに対してメソッド経由で変更しようとした場合は、メソッドはメンバ変数と同じクラス内なので問題なく変更することが出来ます。

ctest2.java

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

    tv1.setChannel(1);
  }
}

class Television{
  private int channelNo;

  void setChannel(int newChannelNo){
    channelNo = newChannelNo;
    System.out.println("新しいChannelNo=" + channelNo);
  }
}

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

p2

では、「private」を付けていないメンバ変数はどういう扱いになっているかと言うと、何も付いていない場合は「public」が付いているのと同等になります。つまり今までは「public」と書くのを省略してわけです。

「public」が付いている場合は、同じクラス内はもちろん、クラスの外部からでもメンバ変数に値を格納したり参照したりと言ったことが可能です。

定義時にpublicを頭に付けたメンバ変数は、メンバ変数を定義したクラス外か
らでもメンバ変数の値を変更したり参照したりする事が出来る。

public 変数の型 メンバ変数名;

なお、publicは省略することが出来るので、単に下記のように記述も出来る。

変数の型 メンバ変数名;

publicは書いても書かなくてもいいのですが、後でプログラムを見て分かりやすいように、そして「private」を書き忘れたわけではなく「public」にしたかったのだと明示的に分かるようにするために、publicは書いておいたほうがいいかと思います。

( Written by Tatsuo Ikura )

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