🎯

【Java】クラス解説16・privateなインスタンス変数

2024/01/14に公開

インスタンス変数(フィールド)のアクセスレベルについて

Javaの一般的な設計原則として、インスタンス変数(フィールド)は原則的にprivateにすることが推奨されています。
また、privateなインスタンス変数にアクセスするためには、アクセサ(=セッターとゲッターを指す)を使用することが一般的です。
アクセサについては、下記の記事を参考にしてください。

https://zenn.dev/goriki/articles/014-encapsulation

privateなインスタンス変数のコード例

public class Main {
    public static void main(String[] args) {
        // インスタンス生成
        Subclass sb = new Subclass();
        // サブクラスのインスタンスからスーパークラスのセッター(メソッド)を呼び出し
        sb.setName("fuzi");
        // サブクラスのインスタンスからサブクラスのメソッドを呼び出し
        sb.printName(); // 出力結果 -> fuzi
    }
}

class MyClass {
    // アクセスレベルがprivateなインスタンス変数
    private String name;
    // アクセサを定義
    public void setName(String n) {
        name = n;
    }
    public String getName() {
        return name;
    }
}

class Subclass extends MyClass {
    // インスタンスメソッドprintNameを定義
    public void printName() {
        // スーパークラスのゲッター(メソッド)を呼び出し
        System.out.println(getName());
    }
}

privateなインスタンス変数のコード例の解説

public class Main {
    public static void main(String[] args) {
        Subclass sb = new Subclass();
        sb.setName("fuzi");
        sb.printName(); // 出力結果 -> fuzi
    }
}

Mainクラスで、

  1. サブクラスのインスタンスsbを定義します。
  2. サブクラスのインスタンスでセッターを呼び出して、実引数としてfuziを渡します。
  3. サブクラスのインスタンスでサブクラスのprintNameメソッドを呼び出します。

class MyClass {
    private String name;
    public void setName(String n) {
        name = n;
    }
    public String getName() {
        return name;
    }
}

スーパークラスのMyClassを定義して、

  1. privateなインスタンス変数nameを定義します。
  2. アクセサのセッターを定義して、仮引数で渡された値fujiをインスタンス変数nameに代入します。
  3. アクセサのゲッターを定義して、戻り値としてfujiが代入されたインスタンス変数nameを呼び出し元に返します。

class Subclass extends MyClass {
    public void printName() {
        System.out.println(getName());
    }
}

MyClassを継承したSubclassを定義して、

  1. printNameメソッドを定義します。
  2. ゲッターを呼び出して、返り値としてfujiが代入されたインスタンス変数nameを受け取りfuziを標準出力に出力します。

Discussion