パッケージ・import・アクセス修飾子のコードトレース

アクセス修飾子はクラスやメンバーを使える場所を制御します。public/privateとパッケージアクセスを中心に、packageとimportの役割を学び、状態を公開メソッドで扱うカプセル化へつなげます。

この単元で学ぶこと

  • public/privateと修飾子なしのアクセス範囲を判定する
  • packageとimportの役割を区別する
  • 公開クラスと公開メンバーの両方の条件を確認する

本文解説

同じパッケージはファイルをまたげる 二つのソースがともにpackage libなら、別ファイルに置いてもパッケージアクセスの型やメンバーを使えます。逆に同じディレクトリへ置いただけでpackage宣言が異なれば同じパッケージにはなりません。宣言する名前空間で判定します。

名前の階層は可視性の階層でない libとlib.childは別パッケージです。libの修飾子なしメンバーをlib.childから使えるという規則はありません。ワイルドカードimportの非再帰性と合わせ、ドットをディレクトリ的に見ただけでアクセス範囲を推測しないようにします。

protectedの補足 protectedは同じパッケージ内で利用でき、別パッケージの子クラスにも制約付きで利用を認めます。ここでは子クラス自身のメソッド内からthisの継承フィールドを使う基本例を扱います。別パッケージの無関係なクラスから自由にアクセスできるpublicとは違います。

同名型とimport 一つの単純名に対して異なる二つの型を単一型importすると衝突します。二つのパッケージのワイルドカードimportで同名型がある場合、その単純名を使用すると曖昧です。完全修飾名ならどちらの型かを指定できます。

自動で見える型 java.langのString、System、Object等は通常importを書かず使えます。同じパッケージの型も簡単な名前で使えます。java.utilのArrayList等がすべて自動で見えるわけではないため、別パッケージは必要なimportか完全修飾名を使います。

static importの補足 import static java.lang.Math.max;ならMath.maxの代わりにmaxと呼べます。通常importで型名を短くする操作と区別します。static importでもアクセス権が必要で、privateなstaticメンバーを外部から公開することはできません。

生成経路の公開 public class Boxでprivate Box()としても、public static Box create(){return new Box();}を定義すれば外側はcreateで取得できます。コンストラクタと型と生成メソッドの三つの公開範囲を別々に見ます。

内部状態の公開方法 getterで値を返すこと、setterで値を検査すること、フィールドをpublicにすることは異なります。検査付きsetterしか公開しない設計なら、外側は不正値を直接代入できません。ただし参照型の内部状態をそのまま返すと変更経路が増えるため、設計ではコピー等を検討します。

図解

別パッケージから利用する二段階
ここでは名前付きモジュールを使わない通常のクラスパス配置を前提にする。

重要ポイント

  • publicでも外から到達する型自体がアクセス可能である必要がある。
  • privateは別トップレベルクラスから直接使えない。
  • 修飾子なしは原則同じパッケージ内のアクセス。
  • importは名前の省略でありアクセス制限を解除しない。

間違えやすい点

  • 同じファイルならprivateへ自由にアクセスできると思わない。
  • パッケージ名の階層をアクセス上の親子だと考えない。
  • ワイルドカードimportがサブパッケージまで含むと思わない。

用語解説

パッケージ
関連する型を名前空間へまとめる単位。
完全修飾名
lib.Boxのようにパッケージ名を含めた型名。
import
別パッケージの型等を簡単な名前で参照するための宣言。
カプセル化
内部状態への直接アクセスを制限し公開操作を通じて扱う設計。

関連教材

参考資料

教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。

確認問題の出題・採点や学習履歴の保存にはログインが必要です。