Java言語プログラミングレッスン下巻
第17章:パッケージ
。この章では
。パッケージとは何か
。名前の衝突とパッケージ
。パッケージの利用
。完全限定名
。importによるクラスの取り込み
。java.langパッケージ
。パッケージの宣言
。パッケージの宣言
。パッケージの階層
。packageとimport
。import宣言の*の意味
。無名パッケージ
。パッケージはクラス階層と無関係
。パッケージとアクセス制御
。アクセス制御とは何か
。アクセス制御の例
。修飾子の意味とアクセス制御一覧
。よく使われるアクセス制御1:publicクラスとそうではないクラス
。よく使われるアクセス制御2:privateメソッド、privateフィールド
。よく使われるアクセス制御3:privateなコンストラクタ
。よく使われるアクセス制御4:privateなコンストラクタ
。パッケージ名は衝突しないのか
。ユニークなパッケージ名
。ユニークなパッケージ名の生成方法
。パッケージの保存場所
。スタティックなインポート宣言
。スタティックなインポート宣言とは何か
。シングル・スタティック・インポート宣言(staticフィールとの取り込み)
。シングル・スタティック・インポート宣言(staticメソッドの取り込み)
。スタティック・インポート・オン・デマンド宣言
。この章で学んだこと
。練習問題
★★★★★
。この章では
。import宣言
。package宣言
。アクセス制御
。パッケージの命名規則
★★★★★
。パッケージとは何か
。名前の衝突とパッケージ
。衝突
。クラスの名前は他のクラスの名前と二重する
。パッケージ
。名前の衝突を防ぐために用意されたグループ分けの仕組み
。たとえクラスの名前が同じであっても、パッケージが異なっている限り、異なるクラスとして扱われる
。名前空間
。クラスの名前やメンバーの名前の集まり
。publicなクラス
。public宣言をしたクラスは、パッケージの外からも利用できる
。public宣言をしていないクラスは、パッケージの中でしか利用できない
★★★★★
。パッケージの利用
。完全限定名(Fully Qualified Name)
。パッケージ名.クラス名(例えば、java.util.Random)
。パッケージ名も合わせて指定した名前
。importによるクラスの取り込み
。import パッケージ名.*;
。タイプ・インポート・オン・デマンド宣言(例えば、import java.util.*;)
。シングル・タイプ・インポート宣言 (例えば、import java.util.Random;)
。java.langパッケージ
。import java.lang.*;
。java.langパッケージ内のpublicクラスとインタフェースは自動的に取り込む
★★★★★
。パッケージの宣言
。パッケージの宣言
。package パッケージ名;(例えば、package mytool;)
。privateメンバー
。publicが付いていないクラス、パッケージ内からのみ使える
。public メンバー
。publicが付いているクラスは、パッケージの外からも使える
。パッケージの階層
。publicが付いていないクラスは、パッケージの下のサブパッケージからも使えない
。packageとimport
。package:パッケージを作る
。import :パッケージを利用する
。import宣言の*の意味
。このパッケージ内のクラスとインタフェースに合致
。このパッケージ内のサブパッケージに合致ではない
。サブパッケージを使いたい場合、サブパッケージ名を書く必要がある
例
import java.awt.*;
import java.awt.image.*;
。無名パッケージ
。パッケージの指定がないとき、宣言されるクラスやインタフェースは無名パッケージ(unnamed package)
。たくさんのクラスからなる大きなプログラムや、他の人へ配布するプログラムの場合には
package宣言を行ってパッケージ名前をつけるのがよい
。パッケージはクラス階層と無関係
★★★★★
。パッケージとアクセス制御
。アクセス制御とは何か
。private 自分のクラス内だけに見せる名前
。なし 自分のパッケージに見せる名前
。protected パッケージだけでなくサブクラスにも見せる名前
。public みんなに見せる名前
。アクセス制御の例
。修飾子の意味とアクセス制御一覧
。public:他のパッケージからのアクセスを許可する
。protected:自パッケージ及びサブクラスからのアクセスを許可する
。修飾子なし:アクセスできる範囲をパッケージ内に制限する
。private:アクセスできる範囲をクラス内だけに制限する
。クラスとインタフェースの制御:public または なし
。クラスがpublicでなければ、メソッドやフィールドをpublicにしても、他のパッケージからは使えない
。クラスとインタフェースに対するアクセス制御
---------------------
なし |同じパッケージからのみ使える
public|他のパッケージからでも使える
---------------------
。クラスのメソッドとフィールドに対するアクセス制御
-------------------------------------------
メソッドと|publicが付いているクラス |publicが付いていないクラス
フィールド|のメソッドとフィールド |のメソッドとフィールド
-----|---------------------|---------------
private |クラス内でのみ使える |クラス内でのみ使える
-----|---------------------|---------------
なし |同じパッケージからのみ使える |同じパッケージからのみ使える
-----|---------------------|---------------
protected |同じパッケージとサブクラスからのみ使える |同じパッケージからのみ使える
-----|---------------------|---------------
public |他のパッケージから使える |同じパッケージからのみ使える
-------------------------------------------
。インタフェースのメソッドとフィールドに対するアクセス制御
-------------------------------------------
メソッドと|publicが付いているクラス |publicが付いていないクラス
フィールド|のメソッドとフィールド |のメソッドとフィールド
-----|---------------------|---------------
private |(指定できない) |(指定できない)
-----|---------------------|---------------
なし |他のパッケージから使える |同じパッケージからのみ使える
-----|---------------------|---------------
protected |(指定できない) |(指定できない)
-----|---------------------|---------------
public |他のパッケージから使える |同じパッケージからのみ使える
-------------------------------------------
。クラスとインタフェースに対するアクセス制御
--------------------------------
メソッドと| クラス | インタフェース |
フィールド|public |publicなし|public |publicなし|
--------------------------------
private |クラス内 |クラス内 |できない|できない |
--------------------------------
なし |同パ |同パ |他パ |同パ |
--------------------------------
protected |同パ、サブクラス|同パ |できない|できない |
--------------------------------
public |他パ |同パ |他パ |同パ |
--------------------------------
。よく使われるアクセス制御1:publicクラスとそうではないクラス
例
package mytool;
public class PublicA { ← このクラスだけがパッケージの外から使える
...
}
class PackageB { ← パッケージ内部の作業用のクラス
...
}
class PackageC { ← パッケージ内部の作業用のクラス
...
}
。よく使われるアクセス制御2:privateメソッド、privateフィールド
public class MyPlayer {
private int mediaId; ← privateなフィールド、内部作業用
public MyPlayer() { ← publicなコンストラクタ
...
}
public void play() { ← publicなメソッド
...
}
public void stop() { ← publicなメソッド
...
}
private void loadFile(String filename) { ← privateなメソッド、内部作業用
...
}
}
。よく使われるアクセス制御3:privateなコンストラクタ
例
package java.lang;
public class Math {
public static double PI = 3.141592653589793;
private Math() { ← privateなコンストラクタ
}
public static double sin(double th) {
...
}
public static double cosin(double th) {
...
}
}
。よく使われるアクセス制御4:privateなコンストラクタ
例
public class MyClass {
private MyClass() { ← privateなコンストラクタ、継承されない
...
}
public MyClass(String s) { ← publicなコンストラクタ、継承されない
this();
...
}
public MyClass(String s, boolean append) { ← publicなコンストラクタ、継承されない
this();
...
}
...
}
★★★★★
。パッケージ名は衝突しないのか
。ユニークなパッケージ名
。ユニークなパッケージ名の生成方法
。自分が所属する組織用にインターネットのドメイン名を取得する
または、すでに組織が持っているドメイン名を用意する
例:softbank.co.jp, stanford.edu
。ドメイン名を逆順する
例:jp.co.softbank, edu.stanford
。できた文字列を、組織内部で定めたパッケージ名の前にくっつける
例:jp.co.softbank.books.mytool.security, edu.stanford.timemachine
★★★★★
。パッケージの保存場所
例
パッケージ名 保存場所
java.lang java\lang
java.io java\io
java.util java\util
java.util.zip java\util\zip
java.awt java\awt
java.awt.image java\awt\image
★★★★★
。スタティックなインポート宣言
。スタティックなインポート宣言とは何か
。シングル・スタティック・インポート宣言
。スタティック・インポート・オン・デマンド宣言
。シングル・スタティック・インポート宣言(single-static-import declaration)
(staticフィールとの取り込み)
例
import static java.lang.System.out;
public class Hello {
public static void main(String[] args) {
out.println("Hello!");
}
}
。シングル・スタティック・インポート宣言(single-static-import declaration)
(staticメソッドの取り込み)
例
import static java.lang.System.out;
import static java.lang.Math.max;
public class Max {
public static void main(String[] args) {
int x = 45;
int y = 100;
int z = max(x, y);
out.println("z = " + z);
}
}
。スタティック・インポート・オン・デマンド宣言(static-import-on-demand declaration)
例
import static java.lang.System.*;
import static java.lang.Math.*;
public class Max2 {
public static void main(String[] args) {
int x = 45;
int y = 100;
int z = max(x, y); → int z = Math.max(x, y);
out.println("z = " + z); → System.out.println("z = " + z);
out.println("π= " + PI); → System.out.println("π= " + PI);
}
}
★★★★★
。この章で学んだこと
。パッケージ
★★★★★
。練習問題
問題17-1
正しいものに○、誤っているものに×
× (1) あるパッケージのクラスを使う場合にはpackageという予約語を使う。
packageではなく、importです
○ (2) publicなクラスは、別のパッケージから利用できる。
× (3) java.langパッケージは自動的に取り込まれるから、java.lang.reflectパッケージも自動的に取り込まれる。
java.langとjava.lang.reflectは別のパッケージです
○ (4) Java言語の文字列と表示するStringクラスの完全限定名はjava.lang.Stringである。
× (5) あるクラスのpublicなメソッドは、別のパッケージから利用できる。
メソッドがpublicでも、クラスがpublic出ない場合には別のパッケージから使えない
× (6) java.ioパッケージには、java.lang.Objectの拡張クラスは含まれない。
パッケージに含まれるクラスとクラス階層は関係ない
× (7) クラスのコンストラクタは常にpublicである。
× (8) privateなメソッドを宣言しても、クラスの外から使えないので意味がない。
クラスの中では使えるので意味がある
○ (9) 同じパッケージ名を使ったpackage宣言を複数のファイルに書いてもよい。
複数のpublicなクラスを含むパッケージを作成するには、必ずこうなる。
問題17-2
正しいものに○、誤っているものに×
○ (1) import java.util.Random; → Randomクラスの取り込み
○ (2) import java.util.*; → java.utilパッケージのクラスとインタフェースの取り込み
× (3) import java.util;
× (4) import java.*;
× (5) import java;
問題17-3
java.awt.ImageFilterクラスをImageFilterとして参照するには、正しいimport宣言をすべて選んでください。
× (1) import java.awt.*;
○ (2) import java.awt.image.*; → java.awtパッケージのクラスとインタフェースの取り込み
○ (3) import java.awt.image.ImageFilter; → ImageFilterクラスの取り込み
問題17-4
本書の最初に登場したプログラムHello.java(上巻p.6)は、List 17-13のようになっていました。
Helloクラスは何というパッケージに属していますか。
Hello.java
public class Hello {
public static void main(String[] args) {
System.out.println("Hello!");
}
}
答え
package宣言がないので、無名パッケージに属しています
問題17-5
List 17-14は、PasswordRegisterはpublicになっていないので、mytool.security以外のパッケージから利用できません。PasswordRegisterを他のパッケージからも利用できるようにするためには、どのようにプログラムを修正すればよいですか。
List 17-14
PasswordChecker.java
----------
package mytool.security;
import yourtool.*;
public class PasswordChecker {
...
}
class Password Register {
...
}
----------
答え
1つのファイルに2つのpublicなクラスを宣言することができないので、PasswordRegisterにpublicを付けるだけではいけません。
ファイルを2つに分けてから、PasswordRegisterをpublicにします。
PasswordChecker.java
----------
package mytool.security;
import yourtool.*;
public class PasswordChecker {
...
}
----------
PasswordRegister.java
----------
package mytool.security;
import yourtool.*;
public class Password Register {
...
}
----------
★★★★★
第17章 終わり