プログラミング 第17回

プログラミング 第17回
パッケージ
[email protected]
プログラミング第17回
1
名前衝突の解決
•
•
•
•
import宣言
package宣言
アクセス制御
パッケージ命名規則
プログラミング第17回
2
パッケージとは
• 名前空間を変えれば,同じ名前でも異なる
クラスとなる。
• 名前空間を分けるのがパッケージ
• 名前空間は階層的な構造をもつ。
– 例 java.util.Vector
プログラミング第17回
3
実験前の確認
• 前回までに,生産者,消費者のスレッドの同期問
題を以下のクラスを作成して実験した。
–
–
–
–
ProducerConsumer
Buffer
Producer
Consumer
• ここまですべてのプログラムは同一作業ディレク
トリに置かれ,クラス名が衝突しないように注意
してきた。
プログラミング第17回
4
実験1 初めてのパッケージ宣言
• ProducerConsumer.java の先頭に
• package produceConsume;
• という1行を挿入して再コンパイルしてみる。
プログラミング第17回
5
ProducerConsumer.java:5: シンボルを解釈処理できません。
シンボル: コンストラクタ Buffer (int)
位置 : produceConsume.Buffer の クラス
Buffer buffer=new Buffer(3);
^
ProducerConsumer.java:6: シンボルを解釈処理できません。
シンボル: コンストラクタ Producer (produceConsume.Buffer)
位置 : produceConsume.Producer の クラス
Producer producer=new Producer(buffer);
^
ProducerConsumer.java:7: シンボルを解釈処理できません。
シンボル: コンストラクタ Consumer (produceConsume.Buffer)
位置 : produceConsume.Consumer の クラス
Consumer consumer=new Consumer(buffer);
^
ProducerConsumer.java:8: シンボルを解釈処理できません。
シンボル: メソッド start ()
位置 : produceConsume.Producer の クラス
producer.start();
^
ProducerConsumer.java:9: シンボルを解釈処理できません。
シンボル: メソッド start ()
位置 : produceConsume.Consumer の クラス
consumer.start();
^
プログラミング第17回
エラー 5 個
実験結果
6
実験結果の意味
• ProducerConsumer だけパッケージされてし
まっていて,必要な他の3つのクラスが見
えなくなってしまった。
• 現在,パッケージ produceConsume には1
つのクラスしかない。
プログラミング第17回
7
実験 2
• Buffer.java, Producer.java, Consumer.java の先
頭に
– package produceConsume;
• を挿入する。
• javac コマンドの引数として
ProducerConsumer.javaも含めて4つのソースファ
イル名を並べて与えてコンパイルする。
• これはエラーなしにうまくいくはず。
プログラミング第17回
8
実験結果の意味
• パッケージにより名前空間が作られた。
• 通常はパッケージはディレクトリとして物理
的にも他の無関係なファイル群と分けるの
が普通。具体的には次項のようにする。
• JavaLessonsの下にproduceConsumeという
パッケージ名と同じ名前のサブディレクトリ
を作成し,4つのソースファイルをすべて移
しておく。
プログラミング第17回
9
実験 3 以下のようにファイルを配置する。
JavaLessons
buffer
Buffer.java
produceConsume
ProducerConsumer.java
Producer.java
Consumer.java
プログラミング第17回
10
実験 3(2)
• パッケージ宣言文を修正
• Buffer.javaは
– package buffer;
– クラス宣言は public を先頭につける
• その他は
– package produceConsume;
– import buffer.*;
– の2行を挿入
プログラミング第17回
11
実験 3(3)
• コンパイルは JavaLessons のディレクトリで
– javac buffer\*.java produceConsume\*.java
• 実行は JavaLessons のディレクトリで
– java produceConsume.ProducerConsumer
プログラミング第17回
12
クラスアクセス制御(Table 17-1, p.204)
なし
同じパッケージからのみ使える。
public
他のパッケージから使える。
プログラミング第17回
13
クラスのメソッド,フィールド(Table 17-2,
p.205)
publicクラス
private
クラス内
publicなしのク
ラス
クラス内
なし
パッケージ内
パッケージ内
protected
パッケージ内
とサブクラス
public
パッケージ内
とサブクラス
他のパッケージ パッケージ内
からも使える
プログラミング第17回
14
インタフェースのメソッド,フィールド(Table
17-2, p.205)
private
なし
protected
public
publicインタ
フェース
指定できない
publicなしのイ
ンタフェース
指定できない
他のパッケージ パッケージ内
からも使える
指定できない
指定できない
他のパッケージ パッケージ内
からも使える
プログラミング第17回
15