パッケージとアクセス制御

パッケージの内部と外部では、 クラスのメンバーへのアクセス権限がどう変わるか解説します。
Javaにはクラスのメンバーに対するアクセスモードを表すキーワードが 3種類ありました。public, protected, privateです。 また、この他にアクセスモードを省略した場合の 「デフォルトのアクセスモード」があります。 この4つのアクセスモードの意味を簡単にまとめると、 下記の表のようになります。

アクセスモードとその許可範囲
public proteced 指定なし private
クラスの内部
同一のパッケージ ×
サブクラス内 × ×
無関係なクラス × × ×

パッケージを指定しなかった場合には、クラスは「名前なしのパッケージ」に 共通して含まれていると見なされます。 したがって、protected の指定も指定なしのデファルトのアクセスモードでも public と実質的な違いはありません。 パッケージを使用しないクラス間では、 publicとprivate の違いしか存在しないわけです。 (他の明示的にパッケージを宣言したクラスからのアクセス権には違いがあります。)

もう一つ勘違いしてはいけない点があります。 protected や private の宣言によって、 内部のデータにアクセスする手続きが完全に禁止されるわけではない、 ということです。 禁止されるのは「.(ピリオド記号)」による直接のアクセスにすぎません。 実際 Javaでは次のような記述法がしばしば用いられます。


/** privateなフィールド */
    private int x;

/** フィールドにアクセスする publicなメソッド */
    public int getX() { return x; }

この場合、他のクラスから object.x という形式でデータにアクセスすることは できませんが、object.getX() という方法で値を取り出すことは自由に行えます。