2020/1/9 曇り時々雨

java学習記録 11回目

参考にさせていただいているサイト:https://nobuo-create.net/

今回やったこと:アクセス修飾子とゲッター、セッター

アクセス修飾子は今までプログラムで、

public class クラス名

などと書いていた「public」の部分。アクセス制限を規定するものであり、種類は下記の通り。

public:どこからでもアクセス可
protected:同一パッケージ内のクラス、継承したクラスからのみ可
デフォルト(何も書かない場合):同一パッケージ内のクラスからのみ可
private:クラス内からのみ可

アクセス制限はpublicがもっともゆるく、privateが最もきつい。
例えば下記のプログラムを考える。

//Human.java

public class Human{
static int count_Human = 0; // メンバ1
String name; // メンバ2
int birthday; // メンバ3
int manpukudo; // メンバ4

Human(String name, int birthday, int manpukudo){ // コンストラクタ1
this.name = name;
this.birthday = birthday;
this.manpukudo = manpukudo;
count_Human++;
}
Human(){ // コンストラクタ2
this("不明", 0, 50);
}

void eat(){     // メンバ5
this.manpukudo += 60;
}
}

//HumanTest.java

public class HumanTest{
public static void main(String args){
System.out.println(Human.count_Human); //①

Human human1 = new Human();
System.out.println(Human.count_Human); //②

Human human2 = new Human();
System.out.println(Human.count_Human); //③
}
}

オブジェクトがつくられるたびにcount_Humanの値が1増えるので、にcount_Humanの数でオブジェクトがつくられた回数を知ることができる。つまり①では0、②では1、③では2になる。
が、やろうと思えば下のようにもできる。

public class HumanTest{
public static void main(String args){
System.out.println(Human.count_Human); //①

Human.count_Human = 100;

Human human1 = new Human();
System.out.println(Human.count_Human); //②

Human human2 = new Human();
System.out.println(Human.count_Human); //③
}
}

この場合②の時点で101になってしまう。
このようなことを防ぐためには下記のようなアクセス制限をかければよい。

//Human.java

public class Human{
private static int count_Human = 0; //「private」を追加
String name;
int birthday;
int manpukudo;

以下略

が、これをやってしまうとHumanTest.javaで、

System.out.println(Human.count_Human);

などとしていた部分がコンパイルエラーとなる。アクセス制限があるから。
このようなprivateなフィールドの値を取り出したい場合は、ゲッターというメソッドを作ればよい。
具体的には下記のような感じ。

//Human.java
public class Human{
private static int count_Human = 0;
String name;
int birthday;
int manpukudo;

// ~コンストラクタ省略~

public static int getCount_Human(){ // ゲッター。count_Humanに合わせてstaticにしておく方が良い。
return count_Human;

以下略

ゲッター自体はpublicなのでprivateなcount_Humanの値を取り出すことができる。具体的には下記。

//HumanTest.java
public class HumanTest{
public static void main(String args){
System.out.println(Human.getCount_Human());

Human human1 = new Human();
System.out.println(Human.getCount_Human());

Human human2 = new Human();
System.out.println(Human.getCount_Human());
}
}

また、privateなフィールドを書き換えたい場合にはセッターというメソッドを作る。
具体的には下記のような感じ。

//Human.java
public class Human{
private static int count_Human = 0;
private String name; //nameをprivateに
int birthday;
int manpukudo;

// 省略

public static String getName(){
return this.name;
}

public void setName(String name){ //nameを書き換えるためのセッター
this.name = name;
}
}

セッターは下記のように使えばよい。

//HumanTest.java
public class HumanTest{
public static void main(String args){
Human human1 = new Human("名前");

human1.setName("変えたい名前");
}
}

今回はここまで。