パッケージ・import・アクセス修飾子を理解する

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

この単元で学ぶこと

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

本文解説

パッケージで名前を分ける ソース先頭のpackage lib;はその型をlibパッケージへ置きます。public class Boxなら完全修飾名はlib.Boxです。別パッケージに同名Boxを定義しても型は別です。ここではモジュールを使わず通常のクラスパスで学びます。

publicの二段階 別パッケージからBoxのメンバーを使うには、Boxという型と対象メンバーがどちらもアクセス可能である必要があります。public class Box{public int n=3;}ならapp.Mainからnew Box().nを読めます。メンバーだけpublicでクラスが非publicなら外から型を使えません。

privateで内部を隠す private int n;は別トップレベルクラスから直接読めません。同じファイルや同じパッケージでもこの制約は残ります。クラス内のpublic int get(){return n;}を入口にすれば、外側は状態の保存方法を知らずに値を取得できます。

修飾子なしの範囲 int read(){...}のような修飾子なしメンバーはパッケージアクセスです。同じpackage libの別クラスなら使えますが、package appやpackage lib.childからは通常使えません。パッケージ名の文字列が似ていても別パッケージです。

importで短い名前を使う package app;の後にimport lib.Box;と書けば本文でBoxと書けます。importがなければlib.Boxと完全修飾して使う方法があります。importはソース上の名前解決を助けるもので、型をコピーしたり公開範囲を変更したりしません。

ワイルドカードの範囲 import lib.*;はlibにあるアクセス可能な型を簡単な名前で使うための指定です。lib.inner.Boxのようなサブパッケージの型は含みません。必要な型を個別importするか、そのパッケージを別に指定します。

ソースの並び 通常のコンパイル単位ではpackage宣言、import宣言、型宣言の順です。importの後へpackageを書くことはできません。publicなトップレベルクラスBoxはBox.javaに置きます。本単元の複数ファイル問題ではコメントのパスごとに保存してまとめてコンパイルします。

公開操作で制約を守る private int n;public void set(int x){if(x>=0)n=x;}のように更新入口へ検査を置けます。外側から直接nを変えられなければ、この検査を通した変更に絞れます。ただしprivateという修飾子だけで値が自動検査されるわけではなく、必要な処理は自分で定義します。

図解

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

重要ポイント

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

間違えやすい点

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

用語解説

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

関連教材

参考資料

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

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