プログラミング 第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
© Copyright 2024 ExpyDoc