【初心者向け】Javaのアクセス修飾子と非アクセス修飾子の違いを徹底解説
Javaには「アクセス修飾子」と「非アクセス修飾子」の2種類の修飾子があります。この2つは名前こそ似ていますが、役割はまったく異なります。本記事では、それぞれの種類・特徴・使い方をわかりやすく解説します。
アクセス修飾子とは
アクセス修飾子は、クラス・変数・メソッド・コンストラクタに付けて、外部からのアクセス範囲(可視性)を制御するためのキーワードです。
Javaには以下の4種類のアクセス修飾子があります。
default(指定なし)
アクセス修飾子を何も指定しない場合、自動的にdefaultとして扱われます。アクセスできる範囲は同一パッケージ内のみに限定されます。public
どこからでもアクセス可能な最も開放的な修飾子です。パッケージの外からでも自由にアクセスできます。private
最も制限の厳しい修飾子で、同じクラス内からのみアクセスできます。外部からの不正な操作を防ぎ、カプセル化を実現する際に使われます。protected
同一パッケージ内に加えて、パッケージ外のサブクラスからもアクセスできます。継承関係のあるクラス間で共有したいメンバーに適しています。
アクセス範囲の比較表
| 修飾子 | 同一クラス | 同一パッケージ | サブクラス(別パッケージ) | すべての場所 |
|---|---|---|---|---|
| private | ○ | × | × | × |
| default | ○ | ○ | × | × |
| protected | ○ | ○ | ○ | × |
| public | ○ | ○ | ○ | ○ |
非アクセス修飾子とは
非アクセス修飾子は、アクセスレベルとは無関係で、指定することによって特別な機能や振る舞いをクラスやメンバーに与えるキーワードです。主なものを以下に紹介します。
final
変数・メソッド・クラスに使用できます。変数に付けると値の変更が禁止され(定数化)、メソッドに付けるとオーバーライドが禁止されます。クラスに付けた場合は、そのクラスを継承できなくなります。static
クラス変数やメソッドに使用し、インスタンスを生成せずにアクセスできるようにします。static変数はメモリ上にただ1つだけ確保され、すべてのオブジェクトで共有されます。おなじみのmain()メソッドもstaticメソッドの代表例です。また、staticブロックを宣言すると、main()メソッドよりも先に実行されます。abstract
クラスとメソッドに使用できます。抽象クラスはインスタンス化できず、継承されることだけを目的とします。抽象メソッドは処理本体を持たず、セミコロンで宣言を終えます。抽象メソッドを1つでも含むクラスはabstractを指定する必要があり、抽象クラスを継承したクラスは、すべての抽象メソッドを実装しなければなりません。synchronized
この修飾子を付けたメソッドは、同時に1つのスレッドからしかアクセスできないことを示します。マルチスレッド環境でのデータ競合を防ぐために使われます。transient
インスタンス変数に付けると、そのオブジェクトをシリアライズする際に、該当する変数を除外するようJVMに指示します。一時的なデータや保存不要な情報に利用されます。volatile
変数が「メインメモリに格納される」ことを示すキーワードです。volatile変数への読み込みはCPUキャッシュではなく必ずメインメモリから行われ、書き込みもCPUキャッシュだけでなくメインメモリに直接反映されます。マルチスレッド間での変数の可視性を保証します。strictfp
浮動小数点演算を行う際に、どのプラットフォーム上でも常に同じ結果が得られることを保証するキーワードです。移植性の高い数値計算が必要な場面で使用されます。
まとめ
アクセス修飾子は「どこからアクセスできるか」を制御し、非アクセス修飾子は「どんな特性や機能を持たせるか」を決めるものです。両者は組み合わせて使うこともできます(例:public static final)。それぞれの役割を正しく理解して、安全で保守性の高いJavaプログラムを書きましょう。
-
JavaのJFrameとJDialogの違いとは?特徴と使い分けを解説
JavaのSwingには、ウィンドウを表示するためのトップレベルコンテナとしてJFrameとJDialogが用意されています。どちらもよく似た役割を持ちますが、動作や用途には重要な違いがあります。この記事では、それぞれの特徴をサンプルコードとともに解説し、最後に使い分けのポイントをまとめます。 JFrameとは フレームに追加されたコンポーネントは「コンテンツ」として扱われ、contentPaneによって管理されます。JFrameにコンポーネントを追加する際は、フレーム本体ではなくcontentPaneに対して追加する必要があります。 JFrameは、タイトル、境界線、(オプションで)メニュ
-
JavaのGridLayoutとGridBagLayoutの違いを徹底解説!特徴と使い分けのポイント
JavaのAWT/Swingには複数のレイアウトマネージャーが用意されていますが、その中でもGridLayoutとGridBagLayoutは、コンポーネントを格子状(グリッド)に配置するという点でよく似ています。しかし、両者には重要な違いがあります。 GridLayoutは、すべてのコンポーネントを矩形のグリッド内に配置し、領域を同じサイズの長方形に分割して、各コンポーネントをそれぞれのセルの中に収めます。一方、GridBagLayoutは柔軟性の高いレイアウトマネージャーであり、コンポーネントのサイズを揃えることなく、縦方向・横方向に整列させて配置できます。各GridBagLayoutオブ