ICT関連の学習備忘録

ICTの学習をアウトプットするワークブックサイト

ICT関連の学習備忘録

2019/09/27:パッケージ・名前空間

パッケージ(package)

同じディレクトリ内にあるクラスは同じパッケージ内と言う扱いに
なるが、配下のディレクトリ内にあるクラスをパッケージに含める場合は
ソースファイルの先頭に下記のように指定をする。
構文
package パッケージ名;

パッケージ名と同じディレクトリを作業中ディレクトリの下に作成して
ソースファイルを保存する

作業中ディレクトリから「javac ディレクトリ名\ソースファイル名」
と入力してコンパイルする

作業中ディレクトリから「java パッケージ名.クラス名
」 と入力して実行する

packageを指定しないソースファイルに記述したクラスは
「名前の無いパッケージ」というものの中に含まれる。
#C:\YJsample\13\pa\Sample2.java
package pa;     //paパッケージに含める。

//車クラス
class Car
{
   private int num;
   private double gas;
   
   public Car()
   {
      num = 0;
      gas = 0.0;
      System.out.println("車を作成しました。");
   }
   public void setCar(int n, double g)
   {
      num = n;
      gas = g;
      System.out.println("ナンバーを" + num + "にガソリン量を" + gas+ "にしました。");
   }
   public void show()
   {
      System.out.println("車のナンバーは" + num + "です。");
      System.out.println("ガソリン量は" + gas + "です。");
   }
}

class Sample2
{
   public static void main(String args[])
   {
      Car car1 = new Car();
      car1.show();
   }
}
コンパイルと実行方法
C:\YJSample\13>javac pa\Sample2.java
      #ディレクトリ名\ソースファイル名でコンパイル。

C:\YJSample\13>java pa.Sample2  #パッケージ名.クラス名で実行している。
#C:\YJsample\13\pa\Sample3.java
package pa;		//paパッケージに含める。

class Sample3
{
    public static void main(String args[])
    {
        Car car1 = new Car();
        car1.setCar(1234,11.1);
        car1.show();
    }
}
#実行結果
C:\YJSample\13>java pa.Sample3  #パッケージ名.クラス名で実行している。
車を作成しました。
ナンバーを1234にガソリン量を11.1にしました。
車のナンバーは1234です。
ガソリン量は11.1です。
#実行結果2
C:\YJSample\13>java pa\Sample3
エラー: メイン・クラスpa\Sample3が見つからなかったかロードできませんでした

異なるパッケージ

異なるファイルに書いたクラスであれば、異なるパッケージに含める
ことも出来るが、同じソースファイル上のクラスを異なるパッケージに
分ける事は出来ず、1つのファイルには1つのパッケージ文しか指定
出来ないようになっている。
コンパイルを試してみる。
#C:\YJsample\13\pb\Sample4.java
package pb;		//pb(paではなく。)パッケージに含める。

class Sample4
{
   public static void main(String args[])
   {
      Car car1 = new Car();
      car1.show();
   }
}
#実行結果
C:\YJSample\13>javac pb\Sample4.java
pb\Sample4.java:7: エラー: シンボルを見つけられません
      Car car1 = new Car();
      ^
  シンボル:   クラス Car
  場所: クラス Sample4
pb\Sample4.java:7: エラー: シンボルを見つけられません
      Car car1 = new Car();
                     ^
  シンボル:   クラス Car
  場所: クラス Sample4
エラー2個
異なるパッケージのクラスを利用するには、
1.利用されるクラスの先頭でpublicをつける
2.利用するクラスの中では、利用されるクラス名にパッケージ名を付けて指定する
という作業が必要になる。
#C:\YJsample\13\pc\Car.java
package pc;		//pcパッケージに含める。
//車クラス
public class Car
{
   private int num;
   private double gas;
   
   public Car()		//class宣言はpublicの指定とする。
   {
      num = 9999;
      gas = 99.9;
      System.out.println("車を作成しました。");
   }
   public void setCar(int n, double g)
   {
      num = n;
      gas = g;
      System.out.println("ナンバーを" + num + "にガソリン量を" + gas+ "にしました。");
   }
   public void show()
   {
      System.out.println("車のナンバーは" + num + "です。");
      System.out.println("ガソリン量は" + gas + "です。");
   }
}
#C:\YJsample\13\pb\Sample5.java
package pb;		//pbパッケージに含める。

class Sample5
{
   public static void main(String args[])
   {
      pc.Car car1 = new pc.Car();	//pc.Carはパッケージpcのclass Carを指している。
      car1.show();
   }
}

#実行結果
C:\YJSample\13>javac pb\Sample5.java

C:\YJSample\13>java pb.Sample5
車を作成しました。
車のナンバーは9999です。
ガソリン量は99.9です。

クラスに付ける修飾詞

クラスの先頭にpublicを付けた場合は、
異なるパッケージから使えるクラスとする。という意味があり、
publicを省略した場合は同じパッケージからしか使えないクラスとする
なお、publicを付けたクラスは、1角ソースファイルの中に1つだけしか
記述する事が出来ない。
修飾詞
クラス・インターフェイスに付ける、修飾詞
修飾詞          意味
無指定  :同じパッケージからのみ使用できるようにする。
public  :異なるパッケージからも使用できるようにする。

メンバ・コンストラクタに付ける修飾詞
private  :同じクラス内でのみアクセス出来るようにする。
無指定    :同じパッケージからのみアクセス出来るようにする。
protected:同じパッケージのクラスと別パッケージのサブクラス
           からのみアクセス出来るようにする。
public   :全てのクラスからアクセス出来るようにする。
          (ただし、クラスがpublic出ない場合は、同じパッケージからのみとなる)

名前空間(namespace)

パッケージ名でクラスを区別する事を名前空間(namespace)と呼ばれている。
大規模なプログラムを作成する場合には、別々の設計者によって
同じ名前の複数のクラスが存在してしまう事もあり、
このような時パッケージ名でクラス名を区別することが大切である。

パッケージ名の付け方
一般的に、名前空間は、開発者の属する組織のドメインを利用することが
推奨されている。
例えば「xxx.co.jp」という組織の場合は、
「jp.co.xxx.・・・」と逆順にした名前を先頭にするパッケージ名を使う。

インポート(import)

異なるパッケージのクラスをたくさん利用するとき、全てのクラスに
毎回パッケージ名を記述する必要があるが、
※「pc.Car car1 = new pc.Car();」←で言うところのpc.Carの部分
インポート(import)する事で省略が出来るようになる。
構文
import パッケージ名.クラス名;
異なるパッケージのクラスをインポートする。
#C:\YJsample\13\pb\Sample6.java
package pb;		//パッケージpbに所属
import pc.Car;	//pc.Carをインポートする(パッケージpcのCarクラスをインポート)

class Sample6
{
   public static void main(String args[])
   {
      Car car1 = new Car();		//インポートしているのでpc.Carとしなくても読み込める
      car1.show();
   }
}

#実行結果
C:\YJSample\13>javac pb\Sample6.java

C:\YJSample\13>java pb.Sample6
車を作成しました。
車のナンバーは9999です。
ガソリン量は99.0です。

サブパッケージ

パッケージの下の階層に作るパッケージを、
サブパッケージ(subpackage)と呼びます。
サブパッケージを作成すれば、役割に似たクラスを階層化された
パッケージに分類し、分かりやすくプログラムを作成していくことが出来る。
ただし、パッケージとサブパッケージはコード上では、
まったく異なるパッケージとして扱われる点に注意。
パッケージを分かりやすく分類するためだけに使われるものである。
C:\YJsample\13\pa\sub\Sample7.java
package pa.sub;		//サブパッケージ(pa\sub\)に含める。
//車クラス
class Car
{
   private int num;
   private double gas;
   
   public Car()
   {
    num = 7777;
    gas = 77.7;
      System.out.println("車を作成しました。");
   }
   public void setCar(int n, double g)
   {
      num = n;
      gas = g;
      System.out.println("ナンバーを" + num + "にガソリン量を" + gas+ "にしました。");
   }
   public void show()
   {
      System.out.println("車のナンバーは" + num + "です。");
      System.out.println("ガソリン量は" + gas + "です。");
   }
}

class Sample7
{
   public static void main(String args[])
   {
      Car car1 = new Car();
      car1.show();
   }
}
実行。

C:\YJSample\13>javac pa\sub\Sample7.java

C:\YJSample\13>java pa.sub.Sample7
車を作成しました。
車のナンバーは7777です。
ガソリン量は77.7です。

複数のクラスをインポート

単一クラスのインポートの場合は次のようにインポートをする。
import java.io.BufferedReader;
import java.io.IOException;
同じパッケージ内のクラスを多く使う場合には、
パッケージ内の複数のクラスを全てインポートすると言うことが出来ます。
import java.io.*;
インポートしたいパッケージを指定し、最後に*(アスタリスク)をつける。
ただし、サブパッケージのクラスまで取り込むことが出来ない点に注意。
サブパッケージのクラスもインポートしたい場合にはそれぞれ
import文を書く必要がある。
import java.aws.*; ←サブパッケージのクラスまでは取り込めない。
import java.awt.image.*; ←サブパッケージも独自に取り込む必要がある。



前のページへ戻る