🗂
[Javaの基礎]クラス
はじめに
ここでは以下についてまとめています。
- クラスの記述方法
- クラスの構成要素
-
getterとsetter 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