アクセス修飾子とは、public、protected、privateといった修飾子の総称で、クラスやそのメンバーがどこからアクセス可能であるかを決定します。
| アクセス修飾子 | |
|---|---|
| アクセス修飾子 | 概要 |
| public | すべてのクラスからアクセスできる |
| protected | 現在のクラスとサブクラスからアクセスできる |
| なし | 現在のクラスと同じパッケージのクラスからアクセスできる |
| private | 現在のクラスからだけアクセスできる |
アクセス修飾子を省略した状態を、パッケージ内部からのみ自由にアクセスできるという意味で、パッケージプライベートと言います。
たとえば以下は、それぞれのアクセスレベルの挙動を確認しています。
ModAccess.java
- package com.example.mynavi.modifier;
- public class ModAccess {
- public String pub_var = "public";
- protected String prot_var = "protected";
- String pack_var = "package private";
- private String pri_var = "private";
- public void test() {
- // クラス内部ではすべてのレベルのメンバーにアクセス可
- System.out.println(this.pub_var);
- System.out.println(this.prot_var);
- System.out.println(this.pack_var);
- System.out.println(this.pri_var);
- }
- public static void main(String[] args) {
- var m = new ModAccess();
- m.test();
- }
- }
↓
- public
- protected
- package private
- private
ModAccessChild.java
- package com.example.mynavi.modifier;
- // ModAccessのサブクラス
- public class ModAccessChild extends ModAccess {
- public void test() {
- System.out.println(this.pub_var);
- System.out.println(this.prot_var);
- System.out.println(this.pack_var);
- //System.out.println(this.pri_var); // プライベート変数にはアクセス不可
- }
- public static void main(String[] args) {
- var mc = new ModAccessChild();
- mc.test();
- }
- }
↓
- public
- protected
- package private
ModAccessOther.java
- package com.example.mynavi.other;
- import com.example.mynavi.modifier.ModAccess;
- // ModAccessと継承関係のない他パッケージのクラス
- public class ModAccessOther {
- public static void main(String[] args) {
- var my = new ModAccess();
- System.out.println(my.pub_var);
- // protected以下のメンバーにはアクセス不可
- // System.out.println(my.prot_var);
- // System.out.println(my.pack_var);
- // System.out.println(my.pri_var);
- }
- }
↓
- 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万部を超える。