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() という方法で値を取り出すことは自由に行えます。