Javaエンジニア・プログラマ向けの技術情報・業界ニュースをお届けします。

  1. FEnetJava
  2. Javaコラム
  3. Java入門
  4. Javaのprotectedを基礎から解説

Javaのprotectedを基礎から解説

  • Java入門
公開日時:   更新日時:
Javaのprotectedを基礎から解説
この記事でわかること
    システム
    エンジニア
    Javaのprotectedとはどのようなものなのでしょうか。
    プロジェクト
    マネージャー
    Javaのprotectedはアクセス修飾子といい、クラスとそれに属するフィールド・メソッドのアクセスできる範囲を制御することができます。

    Javaのprotectedとは?


    Javaのprotectedはアクセス修飾子です。アクセス修飾子はクラスとそれに属するフィールド・メソッドのアクセスできる範囲を制御できます。protectedの他にはpublicとprivateがあります。アクセス修飾子を付けないことも可能です。

    それぞれのアクセスできる範囲の広さは以下の通りです。

    public > protected > (アクセス修飾子を付けない) > private

    この記事ではprotectedを含めたアクセス修飾子について説明します。

    publicについて

    まず最もアクセス範囲の広いpublicですが、これは無条件にどこからでもアクセスできます。以下のTestClassはどこからでもnewできますし、fieldもmethodも呼び出す上で制限はありません。

    public class TestClass {
    public int field;
    public void method() {
    }
    }

    なおpublicのクラスかインターフェイスは1つのファイルに1つしか記述できません。また拡張子.javaを除くファイル名と同一にする必要があります。

    privateについて

    privateはそのクラスの中からのみアクセス可能になります。そのためクラスをprivateにすることはできません。privateは継承した子クラスからもアクセスは禁止です。以下のJavaサンプルでは、fieldやmethodにクラスの外からアクセスはできません。

    class TestClass {
    private int field;

    private void method() {
    }
    }

    なお以下のJavaサンプルのようにコンストラクタをprivateにもできます。こうするとこのクラスをnew出来なくなります。

    class TestClass {
    public static final int HYAKU = 100;

    private TestClass() {
    }

    public static void dispHyaku() {
    System.out.println(HYAKU);
    }
    }

    newを出来なくする意図は、このクラスはHYAKUやstaticMethodといった、クラスをnewしなくても使えるstaticなフィールドやメソッドのみからなることを明確にするためです。

    修飾子無しについて

    修飾子を何もつけない場合、クラスが属するパッケージから自由にアクセスできるものの、その外からはアクセスできなくなります。

    package jp.test;

    class TestClass {
    int field;

    void method() {
    }
    }

    このJavaサンプルのTestClassとfiledとmethodは、jp.test内であれば自由にアクセスできますが、その外からは利用できません。

    protectedについて

    この記事の本題のprotectedについてです。protectedは、同じパッケージ内であれば自由にアクセスできます。そして違うパッケージでも継承した子クラスであればアクセスできます。修飾子無しに「ただし継承関係ならOK」を追加したルールです。なおprivateと同様にクラス自体をprotectedにはできません。

    Javaのサンプルで説明しましょう。まずTestClass.javaには以下のように記述されているとします。

    package jp.test;

    public class TestClass {
    protected int field;

    protected void method() {
    System.out.println(field);
    }
    }

    protectedなら継承すればアクセスできる

    そしてMainClass.javaには以下のように記載されています。これはjp.testパッケージの外です。

    class SubClass extends jp.test.TestClass {
    public void testMethod() {
    field = 100;
    method();
    }
    }

    public class MainClass {
    public static void main(String[] args) {
    SubClass c = new SubClass();
    c.testMethod();
    }
    }

    これを実行すると、

    100

    と表示されます。MainClassからTestClassのfieldやmethodにはアクセスできませんが、TestClassを継承したSubClass内であれば、jp.testパッケージではなくてもアクセスできることがわかります。

    protectedのルールの例外

    protectedはサブクラスであればパッケージの外でもアクセスできる、としましたが、アクセスできないケースがあります。JavaサンプルのSubClassのtestMethodを以下のように変更してみてください。

    class SubClass extends jp.test.TestClass {
    public void testMethod() {
    jp.test.TestClass c = new jp.test.TestClass();
    c.field = 100;
    c.method();
    }
    }

    こうするとfieldとmethodのアクセス箇所がエラーになります。protectedはパッケージの外では、子クラスでも自分自身のインスタンスのメンバーでないとアクセスできないということです。

    protected staticだった場合は?

    もしここまでのJavaサンプルのTestClassのフィールドとメソッドが、以下のようにstaticだったらどうなるのでしょうか?

    public class TestClass {
    protected static int field;

    protected static void method() {
    System.out.println(field);
    }
    }

    SubClassは以下のようにします。MainClassはそのままです。

    class SubClass extends jp.test.TestClass {
    public void testMethod() {
    jp.test.TestClass.field = 100;
    jp.test.TestClass.method();

    jp.test.TestClass c = new jp.test.TestClass();
    c.field = 200;
    c.method();
    }
    }

    protected staticならアクセス範囲が広がる

    上のようにしても今度はエラーになりません。protected staticであれば、自分のインスタンスでなくてもパッケージ外で、サブクラスでアクセスできるのです。実行結果は以下になります。

    100
    200

    ここまで見てきたように、protectedはアクセス可能範囲がわかりにくいと感じる面もあります。外部アクセスは全部OKのpublicや、外部アクセスは全部NGのprivateの方が分かりやすいのも事実なので、protectedは明確な使う理由がある時だけ利用しましょう。

    interfaceでprotectedは可能?

    クラスでなくインターフェイスでprotectedを使うことは可能なのでしょうか?

    public interface TestInterface {
    protected int field = 100;

    protected void method();
    }

    結果はフィールドもメソッドもエラーになります。インターフェイスのフィールドは常にpublic static final扱いで、メソッドはpublicかprivateのみです。インターフェイスのprivateメソッドはJava 9から導入されたのですが、インターフェイス同士では継承ができないのでprotectedは除外されたということです。

    システム
    エンジニア
    Javaのprotectedについてよく理解できました。
    プロジェクト
    マネージャー
    protectedを使用するとエラーになるケースもありますので、使い方をよく把握した上で必要な場合のみ使用しましょう。

    Javaのprotectedをよく理解しよう

    Javaのprotectedについて解説しましたが、ご理解頂けましたでしょうか。意外と落とし穴もあって、protectedはうかつに使えないと感じたと思います。protectedは利用する意義が明確にあるケースのみで使いましょう。

    FEnetJava・Javaコラムは株式会社オープンアップシステムが運営しています。
    株式会社オープンアップシステムロゴ

    株式会社オープンアップシステムはこんな会社です

    秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
    数多くのエンジニアが集まります。

    秋葉原オフィスイメージ
    • スマホアプリから業務系システムまで

      スマホアプリから業務系システムまで

      スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。

    • 充実した研修制度

      充実した研修制度

      毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。

    • 資格取得を応援

      資格取得を応援

      スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。

    • 東証プライム上場企業グループ

      東証プライム上場企業グループ

      オープンアップシステムは東証プライム上場「株式会社夢真ビーネックスグループ」のグループ企業です。

      安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。

    株式会社オープンアップシステムに興味を持った方へ

    株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。

    年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
    まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。

    株式会社オープンアップシステムへのご応募はこちら↓
    株式会社オープンアップシステムへのご応募はこちら↓

    Java新着案件New Job