Java サブフォルダは別パッケージ扱いになる。

Javaで import の機能を使うときには、パッケージの階層構造に含まれているサブフォルダ(サブディレクトリ)は、別パッケージとして扱われることに注意する必要があります。今回はこのことを確認してみましょう。

パッケージとサブパッケージのインポートの仕方は、Javaの標準で用意されているクラスライブラリの使い方とも関係がありますので大事です。


【1】sample10 フォルダをフォルダごとコピーして、sample13 フォルダを作ります。

java-269.gif


【2】testフォルダのクラスファイルは削除して、ソースファイルだけにしてください。

java-270.gif


【3】testフォルダの中に sub というフォルダを新規作成します。

java-271.gif


【4】Person.java を sub フォルダに移動します。

java-272.gif


【5】sub フォルダは以下のようになります。

java-273.gif


【6】Person.java と PersonTest.java を以下のように変更します。

*「\」はWindowsではエンマークのことです。

保存先 C:\java\sample13\net\pgtop\test\sub
ファイル名 Person.java

package net.pgtop.test.sub;

public class Person {
  private String name;
  private int age;
  private String address;

  public Person(String _name, int _age, String _address) {
    name = _name;
    age = _age;
    address = _address;
  }

  public void say(){
    System.out.println("私の名前は" + name + "です。年齢は"
    + age + "才で、住所は" + address + "です。");
  }

  public void setName(String _name){
    name = _name;
  }

  public void setAge(int _age){
    if (_age > 0) {
      age = _age;
    }else{
      age = 0;
    }
  }

  public void setAddress(String _address){
    address = _address;
  }

  public String getName(){
    return name;
  }

  public int getAge(){
    return age;
  }

  public String getAddress(){
    return address;
  }

}



保存先 C:\java\sample13\net\pgtop\test
ファイル名 PersonTest.java

package net.pgtop.test;
import net.pgtop.test.*;

public class PersonTest {
  public static void main(String[] args) {

    Person[] people = new Person[2];
    people[0] = new Person("太郎", 21, "東京都港区");
    people[1] = new Person("花子", 18, "北海道札幌市");

    System.out.println("----- say()メソッドで表示");

    for(int i = 0; i < people.length; i++){
      people[i].say();
    }

    //セッターでデータを設定
    people[0].setName("次郎");
    people[0].setAge(-15);
    people[0].setAddress("福岡県福岡市");
    people[1].setName("桃子");
    people[1].setAge(-25);
    people[1].setAddress("宮城県仙台市");

    System.out.println();
    System.out.println("-----ゲッターでデータを取得して表示");

    for(int i = 0; i < people.length; i++){
      System.out.println(people[i].getName() + " "
        + people[i].getAge() + " " + people[i].getAddress() );
    }

  }
}



【7】コマンドプロンプトを起動して、カレントディレクトリを sample13 に切り替えます。

java-274.gif


【8】javac net\pgtop\test\PersonTest.java と入力し、コンパイルします。

java-275.gif

*カレントディレクトリにソースファイルがないので、ディレクトリを含めたファイル名で指定する必要があります。ファイル名なので「\」を使います。


【9】しかしエラーが表示されました。Person クラスに問題があるようです。

java-276.gif


【10】PersonTest.java を以下のように修正して保存します。

保存先 C:\java\sample13\net\pgtop\test
ファイル名 PersonTest.java

package net.pgtop.test;
import net.pgtop.test.sub.*;

public class PersonTest {
  public static void main(String[] args) {

    Person[] people = new Person[2];
    people[0] = new Person("太郎", 21, "東京都港区");
    people[1] = new Person("花子", 18, "北海道札幌市");

    System.out.println("----- say()メソッドで表示");

    for(int i = 0; i < people.length; i++){
      people[i].say();
    }

    //セッターでデータを設定
    people[0].setName("次郎");
    people[0].setAge(-15);
    people[0].setAddress("福岡県福岡市");
    people[1].setName("桃子");
    people[1].setAge(-25);
    people[1].setAddress("宮城県仙台市");

    System.out.println();
    System.out.println("-----ゲッターでデータを取得して表示");

    for(int i = 0; i < people.length; i++){
      System.out.println(people[i].getName() + " "
        + people[i].getAge() + " " + people[i].getAddress() );
    }

  }
}



【11】保存後、もう一度コンパイルすると今度は成功しました。

java-277.gif


【12】java net.pgtop.test.PersonTest と入力し、プログラムを実行します。

java-278.gif

*プログラムを実行するときは、パッケージ名を含めたクラス名で指定する必要があります。クラス名なので「.」を使います。


【13】プログラムの実行結果が表示されました。

java-279.gif


【解説】

(1)Person.java は sub フォルダに移動したので、パッケージ名の指定が変わりました。
package net.pgtop.test.sub;


(2)PersonTest.java のパッケージ名の指定は問題ないですよね。ちゃんとパッケージ名と同じ階層になるように配置しています。
package net.pgtop.test;


(3)importの機能でアスタリスクを使うと、そのフォルダにあるすべてのクラスが対象になります。importするクラスが多い時に便利です。
import net.pgtop.test.*;

クラスを直接書いても同じ結果になります。
import net.pgtop.test.Person;


(4)PersonTest.java の修正で変えたのは、importの部分だけです。
・最初
import net.pgtop.test.*;

・修正後
import net.pgtop.test.sub.*;


「*」アスタリスクを使っているので、最初の方法でもよさそうですが、アスタリスクはtestフォルダに入っている「クラスファイルが対象」で、「サブフォルダは対象外」です。

つまり同じフォルダ(ディレクトリ)に入っていても、サブフォルダは別パッケージとして認識されます。これはとても大事な点です。

Javaに標準で用意されているクラスライブラリは、階層構造になっていて多くのクラスやサブパッケージが入っていますので、importするときに注意しないと、目的のクラスが使えない原因になります。

サブパッケージは別にインポートする必要があることを覚えておいてください。


スポンサードリンク

スポンサードリンク






Java初心者入門講座TOPへ