【Java入門】final classの使い方

Javaには「final修飾子」という便利な機能があります。

この記事では、

・final修飾子の使い方
・クラスでfinalを使用する方法
・メソッドでfinalを使用する方法

という基本的な内容から、

・finalの速度面での比較

などに関しても解説していきます。

今回はそんなfinal修飾子について、さまざまな方法をわかりやすく解説します!

なお、Javaの記事については、こちらにまとめています。

目次

final修飾子の使い方

final修飾子は、変数のように何度も値を設定することができず、一度値を設定したら変更できないようにするために使用します。

主に変更する予定のない規定値などの値を設定するときに、以下のように宣言して使用します。

public static final double DNUM = 3.1415926535

final修飾子を使用した定数の使い方については、以下の記事で詳しく解説しています。

final修飾子は、変数の値を変更したくないときに使用しますが、クラスやメソッドでも同様に内容を変更できないようにする目的で使用することが可能です。

クラスでfinalを使用する方法

final修飾子を指定してクラスを宣言すると、基本的にその親クラスはサブクラスで継承することができません。

クラスをfinal修飾子で使用する目的としては、サブクラスで不用意に値を変えられたくないときや、親クラスの安全性を保つために使用されます。

クラスをfinalで指定する場合には、以下のように記述します。

 final class 「クラス名」{
     //処理内容
}

以下のように親クラスをfinalで指定すると、extendsを使用した親クラスの継承が設定できずに、コンパイルエラーとなります。

final class FruitsClass{
    FruitsClass(){
	    System.out.println("FruitClass");
	}
}
	 
class AppleClass extends FruitsClass{
    AppleClass(){
	    System.out.println("AppleClass");
	}
}

メソッドでfinalを使用する方法

親クラスのメソッドの内容を、サブクラスで不用意に変えられたくない場合は、メソッドにfinal修飾子を指定することもできます。

final修飾子でメソッドを指定する場合は、以下のように記述します。

final void 「メソッド名」{
      //処理内容
 }

以下のように親クラスであるFruitsClassのメソッドに対して、final修飾子を付与すると、サブクラスで親クラスのメソッドのオーバーライドができなくなります。

class FruitsClass{

    final void fruits(){
    	//処理内容
    }
}

class AppleClass extends FruitsClass{

	void fruits(){
		//処理内容
	}
}

finalのパフォーマンス

final修飾子を指定した場合の速度面はどうなのでしょうか?

以下にfinal修飾子を指定した定数と通常の変数で、ループの中で1000回演算したときの速度を、ナノ秒単位で計測してみました。

public class FinalClass {
	//クラス定数を宣言
	public static final int NUM = 10;

	public static void main(String[] args) {

		//速度計測 finalあり
		long start1 = System.nanoTime();
		int fval =0;
		for ( int i=0; i<1000; i++){
			fval = fval + NUM + i;
		}
		long end1 = System.nanoTime();
		System.out.println("final : " + (end1 - start1) / 1000000f + "ms");
		
		//速度計測 finalなし
		int num = 10;
		int val =0;
		long start2 = System.nanoTime();
		for ( int j=0; j<1000; j++){
			val = val + num + j;
		}
		
		long end2 = System.nanoTime();
		System.out.println("not final : " + (end2 - start2) / 1000000f + "ms");
		
	}
}
実行結果
<1回目>
final : 0.017818ms
not final : 0.023921ms

<2回目>
final : 0.012512ms
not final : 0.025403ms

<3回目>
final : 0.012461ms
not final : 0.02599ms

実行結果のとおり、finalを付加したほうが処理速度が早いことがわかりました!

クラスについてもっと詳しく知りたい方へ

クラスのさまざまな使い方については、以下の記事にまとめていますので、ぜひ参考にしてくださいね!

finalについてもっと詳しく知りたい方へ

finalのさまざまな使い方については、以下の記事にまとめていますので、ぜひ参考にしてくださいね!

まとめ

ここではfinal修飾子について、意味や基本的な使い方の説明、定数と変数の速度比較の検証を行いました。

final修飾子は不用意に変数や、クラス・メソッドの内容を変えられたくないときに使用します。

もし、クラスやメソッドをfinalで指定する方法を忘れてしまったら、この記事を思い出してくださいね!

この記事を書いた人

【プロフィール】
DX認定取得事業者に選定されている株式会社SAMURAIのマーケティング・コミュニケーション部が運営。「質の高いIT教育を、すべての人に」をミッションに、IT・プログラミングを学び始めた初学者の方に向け記事を執筆。
累計指導者数4万5,000名以上のプログラミングスクール「侍エンジニア」、累計登録者数1万8,000人以上のオンライン学習サービス「侍テラコヤ」で扱う教材開発のノウハウ、2013年の創業から運営で得た知見に基づき、記事の執筆だけでなく編集・監修も担当しています。
【専門分野】
IT/Web開発/AI・ロボット開発/インフラ開発/ゲーム開発/AI/Webデザイン

目次