注目記事

【Javaコード入門】修飾子_②アクセス修飾子

アクセス修飾子とは、public、protected、privateといった修飾子の総称で、クラスやそのメンバーがどこからアクセス可能であるかを決定します。

アクセス修飾子
アクセス修飾子 概要
public すべてのクラスからアクセスできる
protected 現在のクラスとサブクラスからアクセスできる
なし 現在のクラスと同じパッケージのクラスからアクセスできる
private 現在のクラスからだけアクセスできる

アクセス修飾子を省略した状態を、パッケージ内部からのみ自由にアクセスできるという意味で、パッケージプライベートと言います。
たとえば以下は、それぞれのアクセスレベルの挙動を確認しています。

ModAccess.java

  1. package com.example.mynavi.modifier;
  2.  
  3. public class ModAccess {
  4. public String pub_var = "public";
  5. protected String prot_var = "protected";
  6. String pack_var = "package private";
  7. private String pri_var = "private";
  8.  
  9. public void test() {
  10. // クラス内部ではすべてのレベルのメンバーにアクセス可
  11. System.out.println(this.pub_var);
  12. System.out.println(this.prot_var);
  13. System.out.println(this.pack_var);
  14. System.out.println(this.pri_var);
  15. }
  16.  
  17. public static void main(String[​] args) {
  18. var m = new ModAccess();
  19. m.test();
  20. }
  21. }

  1. public
  2. protected
  3. package private
  4. private

ModAccessChild.java

  1. package com.example.mynavi.modifier;
  2.  
  3. // ModAccessのサブクラス
  4. public class ModAccessChild extends ModAccess {
  5. public void test() {
  6. System.out.println(this.pub_var);
  7. System.out.println(this.prot_var);
  8. System.out.println(this.pack_var);
  9. //System.out.println(this.pri_var); // プライベート変数にはアクセス不可
  10. }
  11.  
  12. public static void main(String[​] args) {
  13. var mc = new ModAccessChild();
  14. mc.test();
  15. }
  16. }

  1. public
  2. protected
  3. package private

ModAccessOther.java

  1. package com.example.mynavi.other;
  2.  
  3. import com.example.mynavi.modifier.ModAccess;
  4.  
  5. // ModAccessと継承関係のない他パッケージのクラス
  6. public class ModAccessOther {
  7. public static void main(String[​] args) {
  8. var my = new ModAccess();
  9. System.out.println(my.pub_var);
  10. // protected以下のメンバーにはアクセス不可
  11. // System.out.println(my.prot_var);
  12. // System.out.println(my.pack_var);
  13. // System.out.println(my.pri_var);
  14. }
  15. }

  1. public

アクセス修飾子を付与する際のルールはただひとつ、「要件を満たす範囲でできるだけ狭いアクセス範囲を指定する」ことです。特にパッケージプライベートとpublic/protectedとの間には、大きな差があります。パッケージプライベート/privateであるということはAPIが非公開であることを意味しますので、実装を修正する際にも互換性の維持などをそこまで意識する必要はありません。しかし、public/protectedは公開APIなので、利用者に対して一定の責任を負うことになります。

修飾子_目次
修飾子
アクセス修飾子
abstract修飾子
static修飾子
final修飾子
sealed/non-sealed修飾子
transient修飾子
volatile修飾子
synchronized修飾子
native修飾子
strictfp修飾子

監修

山田祥寛(有限会社 WINGSプロジェクト)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NEC にてシステム企画業務に携わるが、2003年 4 月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト(https://wings.msn.to/)」の代表でもある。主な著書に『改訂 3 版JavaScript 本格入門』(技術評論社)、「独習シリーズ(C#・Python・PHP・Ruby・JSP&サーブレットなど)」(翔泳社)、「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravel など)」(Amazon Kindle)など。売り上げの累計は100万部を超える。