🗂

[Javaの基礎]クラス

に公開

はじめに

ここでは以下についてまとめています。

  • クラスの記述方法
  • クラスの構成要素
  • gettersetter
  • static

クラス

クラスはオブジェクト指向プログラミングの中心的な概念です。
以下はPersonというクラスです。

public class Person {
    // フィールド(属性)
    String name;
    int age;

    // コンストラクタ(初期化)
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // メソッド(動作)
    public void greet() {
        System.out.println("Hello, my name is " + name);
    }
}

オブジェクトの作成と使用

Person p = new Person("Taro", 20);
p.greet(); // 出力:Hello, my name is Taro

クラスの構成要素

要素 説明
フィールド データ(変数) String name;
コンストラクタ オブジェクト生成時に初期化されるメソッド Person(String name, int age)
メソッド クラスに紐づく関数(動作) public void greet()
アクセス修飾子 可視範囲を指定するキーワード(後述) public, private, protected
static 静的メンバー(クラス全体で共有) static int count;

getterとsetter

クラスのフィールド(変数)に対するアクセスや変更をコントロールするためのメソッドです。特に、カプセル化(encapsulation)を実現するために重要です。
以下の理由でgetterとsetterは利用されます。

理由
データの不正操作を防ぐ 例:年齢がマイナスにならないように制限できる
保守性向上 実装を変えてもインターフェースが保たれる
読み取り専用や書き込み専用にもできる getterまたはsetterだけを定義可能
後で処理を追加できる ログ出力や通知処理などを追加しやすい

カプセル化

  • フィールドをprivateにして、直接アクセスを禁止にする
  • アクセス用のpublicメソッド(getter/setter)を提供して、制御された方法でアクセス可能にする

getter/setterの基本構文

getter/setterは以下のように使用します。

public class Person {
    private String name;
    private int age;

    // getter(取得)
    public String getName() {
        return name;
    }

    // setter(設定)
    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age >= 0) { // 妥当性チェックも可能
            this.age = age;
        }
    }
}
Person p = new Person();
p.setName("Taro");
p.setAge(20);

System.out.println(p.getName()); // Taro
System.out.println(p.getAge());  // 20

static

staticは、インスタンス(オブジェクト)ではなくクラスに直接属するメンバー(変数・メソッド)を定義するためのキーワードです。
staticを使えばインスタンスを作らなくてもアクセス可能になります。

static変数(フィールド)

public class Counter {
    public static int count = 0;

    public Counter() {
        count++;
    }
}
System.out.println(Counter.count); // → 0

new Counter();
new Counter();

System.out.println(Counter.count); // → 2(全インスタンスで共有されている)

staticメソッド

staticメソッド内では、インスタンス変数は使えません。

public class MathUtil {
    public static int square(int x) {
        return x * x;
    }
}
int result = MathUtil.square(5); // → 25

static初期化ブロック

クラスが初めて使われるとき(ロード時)に一度だけ実行されます。

public class InitExample {
    static int data;

    static {
        data = 100;
        System.out.println("クラスロード時に一度だけ実行");
    }
}

static内部クラス(ネストクラス)

public class Outer {
    static class Inner {
        static void hello() {
            System.out.println("Hello from static inner class!");
        }
    }
}
Outer.Inner.hello(); // インスタンス不要で呼び出し可能

static+final

クラス共通の定数を作りたいときに使用します。

  • final:変更できない
public class Config {
    public static final String VERSION = "1.0.0";
}
System.out.println(Config.VERSION);

Discussion