Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaのstaticキーワードとは?メソッド・変数・ブロックの使い方を徹底解説

Javaのstaticキーワードの使い方

Javaでクラスを扱う際、通常はクラスのインスタンスを生成してから、そのメンバーにアクセスする必要があります。しかし、インスタンスを生成せずにクラスメンバーを定義したい場面もあります。

そんなときに役立つのが、Javaのstaticキーワードです。staticキーワードを使用すると、インスタンスを生成しなくてもアクセスできるクラスメンバーを定義できます。

この記事では、具体例を交えながら、staticキーワードの基本と、Javaプログラムでの実践的な使い方を解説します。

Javaのクラスとは

Javaにおいて、クラスはオブジェクトの設計図です。例えば、OrderCoffeeというクラスには、コーヒーの注文に関するすべての機能(注文の受け付け、既存注文の変更、注文への商品追加など)を持たせることができます。

そのクラスをもとに、インスタンスであるオブジェクトを作成できます。例えば、CoffeeOrder12というオブジェクトは、CoffeeOrderクラスの設計図を利用して、個別のコーヒー注文のデータを保存します。CoffeeOrder12オブジェクトは、CoffeeOrderクラス内で宣言されたすべての関数やメソッドにアクセス可能です。

Javaクラスの基本がわかったところで、次はstaticキーワードについて詳しく見ていきましょう。

Javaのstaticメソッド

staticメソッド(クラスメソッドとも呼ばれます)は、クラスのインスタンスではなく、クラスそのものに属するメソッドです。staticメソッドはクラスに属するため、呼び出しはクラス自体から行い、クラスのオブジェクトからは行いません。

staticメソッドを呼び出す構文は以下のとおりです。

Class.methodName();

具体例で確認してみましょう。

コーヒーショップの注文を管理するプログラムを作成するとします。コーヒーの注文に関するすべての機能を格納する、CoffeeOrderクラスを作成したいと考えます。

ここで、新しい注文の通知をバリスタのコンソールに出力できるようにしたいとします。この新規注文通知は、注文オブジェクト内の他のコードに依存しないため、staticメソッドとして定義するのが適切です。以下のコードでこの処理を実現できます。

class CoffeeOrder {
	int createOrder() {
		// Code here
		int orderNumber = 92;
		return orderNumber;
	}

	static void printOrder(int order) {
		System.out.println("Order #" + order + " order has been placed.");
	}
}

class Main {
	public static void main(String[] args) {
		CoffeeOrder order92 = new CoffeeOrder();

		int number = order92.createOrder();
		System.out.println("Order number: " + number);

		CoffeeOrder.printOrder(number);
	}
}

このコードを実行すると、次の出力が得られます。

Order number: 92
Order #92 has been placed.

コードを順番に見ていきましょう。まず、CoffeeOrderというクラスを宣言しています。CoffeeOrderには、createOrder()printOrder()という2つのメソッドが含まれています。

createOrder()は、注文を作成して注文番号を返す通常のメソッドです。一方、printOrder()は、新しい注文が入ったことをバリスタに通知するメッセージをコンソールに出力するstaticメソッドです。

メインプログラムでは、order92というCoffeeOrderオブジェクトを作成します。このオブジェクトは注文#92のデータを保存します。次に、createOrder()メソッドを使って注文番号を取得し、「Order number: 」という接頭辞を付けてコンソールに出力しています。

createOrder()メソッドの呼び出しには、order92.createOrder()を使用しています。これは、createOrder()がstaticメソッドではないため、オブジェクトを操作する際にアクセスできるからです。

メインコードの最後では、CoffeeOrder.printOrder()を使って、「Order #[注文番号] order has been placed.」というメッセージをコンソールに出力します。printOrder()はstaticメソッドであるため、クラス名であるCoffeeOrderを使ってアクセスする必要があります。

もしcreateOrder()のときと同じように、order92.printOrder()とインスタンス経由で呼び出そうとすると、コードは警告を表示します。

Javaのstatic変数

Javaのstaticキーワードは、static変数(クラス変数)の作成にも使用できます。static変数はクラスに属し、プログラムの実行開始時に一度だけ初期化されます。

static変数は個々のオブジェクトに属しません。そのため、アクセスする際はクラスを参照するのが基本となります。Javaでstatic変数を宣言する構文は以下のとおりです。

static String COFFEE_NAME = "Espresso";

この例では、COFFEE_NAMEというstatic変数を宣言し、文字列「Espresso」を代入しています。

次に、static変数の実際の使用例を見ていきましょう。

コーヒーショップで注文を処理するプログラムを作成するとします。このプログラムは、勤務中のバリスタの人数を保存し、注文が作成されたときに、その注文を担当するバリスタの名前を関連付ける必要があります。

以下のコードで、このコーヒー注文処理プログラムを作成できます。

class CoffeeOrder {
	int baristasOnDuty = 2;
	static String name = "Hannah Johnson";

	public static void main(String[] args) {
		CoffeeOrder order111 = new CoffeeOrder();

		System.out.println("Baristas on duty: " + baristasOnDuty);
		System.out.println("Assigned barista: " + order111.name);
	}
}

このコードを実行すると、次の出力が得られます。

Baristas on duty: 2
Assigned barista: Hannah Johnson

このコードでは、次の2つの変数を宣言しています。

  • baristasOnDuty:通常の(インスタンス)変数です。クラス内のどこからでもアクセスできます。
  • name:static変数です。クラスに属するため、クラス名を介してアクセスするのが推奨されます。

メインプログラムでは、CoffeeOrderクラスのインスタンスを作成し、order111という名前を付けています。その後、「Baristas on duty: 」というメッセージに続けて、baristasOnDuty変数の内容を出力します。これは通常の変数なので、クラス名を参照する必要はありません。

コードの次の行では、「Assigned barista: 」というメッセージに続けて、注文が割り当てられたバリスタの名前を出力しています。バリスタの名前はstatic変数として保存されているため、本来はCoffeeOrder.nameのようにクラス名でアクセスするのがベストプラクティスです。この例のようにorder111.nameとオブジェクト参照からアクセスすることも可能ですが、可読性の観点からクラス名でのアクセスが望ましいでしょう。

Javaのstaticブロック

Javaのstaticキーワードは、staticブロックの作成にも使用できます。クラス内に個別に初期化が必要な複数のstatic変数がある場合は、staticブロックを活用するとよいでしょう。

staticブロックは、クラスが最初にメモリへロードされるときに、一度だけ実行されます。Javaのstaticブロックの構文は以下のとおりです。

static {
	// Code here
}

staticブロックの動作を示す例を見てみましょう。プログラムが注文をバリスタに割り当てる前に、「A new order is incoming …」というメッセージをコンソールに出力し、バリスタに準備を促したいとします。これは、staticブロックを作成することで実現できます。staticブロックは、クラスがロードされる最初のタイミングで実行されます。

以下は、前述のメッセージを出力してから注文をバリスタに割り当てるstaticブロックを含むコード例です。

class CoffeeOrder {
	int baristasOnDuty = 2;
	static String name = "Hannah Johnson";
	static {
		System.out.println("A new order is incoming …");
	}

	public static void main(String[] args) {
		CoffeeOrder order111 = new CoffeeOrder();

		System.out.println("Baristas on duty: " + baristasOnDuty);
		System.out.println("Assigned barista: " + order111.name);
	}
}

このコードを実行すると、次の出力が得られます。

A new order is incoming …
Baristas on duty: 2
Assigned barista: Hannah Johnson

このコードでは、まずbaristasOnDuty変数とname変数を初期化しています。その後、プログラムは「A new order is incoming …」というメッセージをコンソールに出力します。このメッセージはstaticブロック内に記述されており、クラスのロード時に実行されます。staticブロックの処理が完了した後、メインプログラムが実行され、前の例と同じ出力が得られます。

まとめ

Javaのstaticキーワードにはさまざまな用途があります。staticメソッド、static変数、staticブロックの作成に利用でき、それぞれインスタンス化なしでクラスレベルの機能を実現するのに役立ちます。

この記事では、具体例を交えながら、staticキーワードの基本と、メソッド・変数・コードブロックそれぞれでの使い方を解説しました。この記事の内容を理解すれば、Javaのstaticキーワードを自信を持って使いこなせるようになるでしょう。

  1. Javaの抽象クラスとは?基本ルールと実装例をわかりやすく解説

    Javaの抽象クラスとは宣言に「abstract」キーワードを含むクラスは、抽象クラスと呼ばれます。抽象クラスは、継承によって利用されることを前提とした設計用のクラスであり、オブジェクト指向プログラミングにおける重要な概念の一つです。抽象クラスの主な特徴抽象クラスには、抽象メソッド(本体を持たないメソッド。例:public void get();)が含まれる場合もあれば、含まれない場合もあります。ただし、クラス内に1つでも抽象メソッドが存在する場合、そのクラスは必ず abstract として宣言しなければなりません。abstract として宣言されたクラスは、インスタンス化(newによるオブジ

  2. Javaのfinalクラスとは?継承を禁止する仕組みと使い方を徹底解説

    Javaにおいて、クラスにfinal修飾子を付けて宣言する最大の目的は、そのクラスがサブクラス化(継承)されることを防ぐことです。クラスがfinalとして宣言されると、どのクラスもそのクラスを継承できなくなり、finalクラスの機能や振る舞いを拡張・変更することが不可能になります。finalクラスの基本構文finalクラスの宣言は非常にシンプルです。クラス名の前にfinalキーワードを付けるだけです。public final class Test { // クラスの本体 }このように宣言されたTestクラスに対して、以下のような継承を試みるとコンパイルエラーが発生します。// コンパイ