Java: package-パッケージ間のACCESS
ここで扱うプログラムは以下の三つのソースファイルに分かれている。
1) Abst_Class1.java
このソースはabst_class1というパッケージに属する。
そこにはinterfaceが二つあり、inter1,inter2である。さらに、Abst_Class1というクラスが存在する。このクラスは2)のClass1に継承される。
2) Class1.java
このソースはclass1というパッケージに属する。ここにはAbst_Class1を継承したClass1というクラスが存在する。
3) Proo13_1.java
このソースはproo13_1というパッケージに属する。ここにはProo13_1というクラスが存在し、上記の二つのクラスを使う。
packageとはクラスを分類するjava の命令である。ソースプログラムの先頭で以下のように指定する。
package abst_class1;
そうすると、2行目以降のクラスがabst_class1 というパッケージに属することになる。パッケージはディレクトリーと一致させて作る。
作成したソースプログラムのファイル名をAbst_class1.javaとし、 abst_class1というパッケージに属する。カレントディレクトリの下にabst_class1というディレクトリを作り、その中にAbst_class1.javaのファイルを置く。そして、以下の操作をするとコンパイルされる。
>javac abst_class1\Abst_cass1.java
Abst_cass1.javaの中身は以下の通りである。
package abst_class1; interface inter1{ void show1(); void show2(); } public abstract class Abst_Class1 implements inter1 { private int num1; protected Abst_Class1(int n){this.num1=n;} public void show1(){ System.out.println("show1 num1=" + num1 ); } public abstract void show2(); }
説明:このパッケージにはインターフェースinter1があり、そこにメソッドが二つある。またAbst_Class1というabstractクラスがある。メソッドshow1はここで実装されている。しかし、メソッドshow2はabstractのままである。二つのメソッドはインターフェースから来ているので、publicにしてある。 Abst_Class1は別パッケージにある子クラスClass1から呼び出される予定であるので、protectedとしてある。num1は最大保護するためprivateとしてある。
続いて、class1のディレクトリを作りそこにClass1.javaを置き、以下のようにコンパイルする
>javac class1\Class1.java
Class1.javaの中身は以下の通りである。
package class1; import abst_class1.*; public class Class1 extends Abst_Class1 { private String s1; public Class1(int n, String s){ super(n); this.s1 = s; } public void show2(){ show1(); System.out.println("show2 s1="+s1); } }
説明:
1行 ここにあるクラスは全てclass1というパッケージに属する。
2行 abst_class1のクラスを使うので、その中のパッケージをimportしている。*はその中のすべてのクラスを意味する。
5行 このコンストラクタは別パッケージから使われるので、publicにしている。勿論、Class1もpublicである。
9行 show2を実装している。
importについて:
これは指定されたパッケージの中のクラスをあたかも当該パッケージに移したごとく振舞えるということです。*の代わりにクラス名を指定するとそのクラスだけを移したかのようになるということです。
続いて、proo13_1のディレクトリを作りそこにProo13_1.javaを置き、以下のようにコンパイルする
>javac proo13_1\Proo13_1.java
Proo13_1.javaの中身は以下の通りである。
package proo13_1; import abst_class1.*; import class1.*; class Proo13_1{ public static void main(String args[]){ Abst_Class1 f1 = new Class1(1, "Tokyo"); f1.show2(); } } /* 出力 show1 num1=1 show2 s1=Tokyo */
説明:
2,3行 二つのパケージをimportしている。
末尾には実行結果がある。
全てコンパイルできたところで、以下のように実行する。
>java proo13_1.Proo13_1
実行結果はProo13_1.javaの末尾にある。
ACCESS修飾子protectedに関するACCESS制御は以下の二つの表の通りです。