Javaのアクセス修飾子について

親クラスのメンバー(フィールド、メソッド)が子クラスから
アクセスできるかどうかの判断について記します。

1.4つの「アクセス修飾子」
  • public
  • protect
  • 空白(何もつけない)
  • private
    • 識別子:
    • public
    • protected
    • 空白
    • private
    • 公開範囲:
    • 広い
    • 狭い
    覚え方は「ぱぶ(pub)/ぷろ(pro)/でふぉ(def)/ぷり(pri)」で(順番が重要)。

2.「アクセス修飾子」の意味を覚える
public
他のクラスからアクセスできる
public		int	num3; // public修飾子を付ける
protected
子クラスからアクセスできる
protected	int	num2; // protected修飾子を付ける
空白(何もつけない)
同じパッケージ内の子クラスからのみアクセスできる
            int	num1;		// まったく修飾子を付けない
private
そのクラス内でのみアクセスできる
他のクラスから見えない
private	int 	num;		// private修飾子を付ける

3.使用例1 ー 別のクラスからの参照

ファイル:Super.java

    package smplepkg; //サンプルパッケージ

    public class Super {

        private    int 	num;

                   int	num1;

        protected  int	num2;

        public     int 	num3;

        public int getNum() {
            return this.num;
        }

        public void setNum(int n) {
            this.num = n;
        }

    }

ファイル:Sub.java

    import smplepkg.*; //サンプルパッケージのクラスをインポート

    class Sub extends Super {

        Sub() {

            //System.out.println(num);  // numはprivateなので見えない
            //System.out.println(num1); // numはデフォルトなので他のパッケージからは見えない
            System.out.println(num2);   // num2はprotectなのでSuperを継承しているため見える
            System.out.println(num3);   // num3はpublicなので無条件に見える

          }

      }
SuperクラスとSubクラスが別のパッケージの場合です。
ファイルSub.javaの先頭でsamplepkg.Superをインポートしていますが
Subクラスはsamplepkgには属していません。
なぜなら、ファイル冒頭で以下のパッケージ宣言、

package samplepkg;

が行われていないからです。

ファイル冒頭にpackage宣言がない場合、
そのファイルで宣言されているクラスは
デフォルトパッケージ(標準のパッケージ)に属していると判断されます。

したがって、この場合、

samplepkgパッケージのSuperクラス

デフォルトパッケージのSubクラス

は別のパッケージに属していることになります。
ファイル冒頭のpackageに関する宣言は注意深く確認する必要があります。

4.使用例2 ー 同じクラスからの参照

ファイル:Super.java

      3.と同じ
      ...

ファイル:Sub.java

    package smplepkg;	// (1)

    class Sub extends Super {

        Sub() {

            //System.out.println(num);	// numはprivateなので見えない
            System.out.println(num1);	// num1はデフォルトなので同じパッケージからは見える
            System.out.println(num2);	// num2はprotectなので同じパッケージからは見える
            System.out.println(num3);	// num3はpublicなので無条件に見える

        }

      }
SuperクラスとSubクラスが同じパッケージの場合です。
今回はファイルSub.javaの先頭で以下のパッケージ宣言、

package samplepkg;

が行われています。 行(1)
親クラスであるSuperクラスのメンバーnum1(アクセス属性がデフォルト)にアクセスが可能になりました。


†メンバーには他に「ネステッドクラス」などありますが本稿では割愛します。
†「アクセスが可能」などの表現については「継承している」「参照可能である」「見える」「可視/不可視」など、違った表現が用いられることがあります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA