Javaに標準で用意されているクラスライブラリや、他者が作ったクラスを再利用するときは別のパッケージになります。
同一パッケージにあるクラスは「クラス名」だけで使えますが、異なるパッケージにあるクラスを利用するときは、クラス名を「完全修飾名」で書く必要があります。今回はこの方法を学びます。
【1】sample10 フォルダをフォルダごとコピーして、sample11 フォルダを作ります。

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

【3】PersonTest.java を sample11 フォルダの直下に移動します。

【4】PersonTest.java を sample11 フォルダに移動しました。

【5】test フォルダには Person.java だけが残っています。

【6】Person.java はそのままです。PersonTest.java を以下のように変更します。
*「\」はWindowsではエンマークのことです。
保存先 C:\java\sample11\net\pgtop\test
ファイル名 Person.java
package net.pgtop.test;
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\sample11
ファイル名 PersonTest.java
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】コマンドプロンプトを起動して、カレントディレクトリを sample11 に切り替えます。

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

*今回は PersonTest.java が sample11 の直下にあるので、普通の方法でコンパイルします。
【9】しかしエラーメッセージが表示されました。エラーメッセージを読むと、どうやら Person に問題があるようです。

*実は異なるパッケージのクラスを利用するときは、クラス名を「完全修飾名」で指定する必要があります。
【10】そこでPersonTest.javaを以下のように修正します。「Person」の部分を「net.pgtop.test.Person」にしただけです。

保存先 C:\java\sample11
ファイル名 PersonTest.java
public class PersonTest {
public static void main(String[] args) {
net.pgtop.test.Person[] people = new net.pgtop.test.Person[2];
people[0] = new net.pgtop.test.Person("太郎", 21, "東京都港区");
people[1] = new net.pgtop.test.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】もう一度コンパイルすると、今度は上手くできました。

【12】コンパイルが成功すると、各ソースファイルがあったフォルダの中にクラスファイルが作成されます。
・sample11の中

・testの中

【13】java PersonTest と入力し、プログラムを実行します。

*今回は PersonTest.class が sample11 の直下にあるので、普通の方法で実行できます。
【14】プログラムの実行結果が表示されました。

【解説】
(1)PersonTest クラスはパッケージの指定を省きましたので、無名パッケージです。Person クラスは「net.pgtop.test.Personパッケージ」なので、この2つは別のパッケージになります。
(2)利用するクラスがどのパッケージにあるかで、クラス名の書き方が異なります。他のパッケージにあるクラスを利用する時は、「完全修飾名」で書きます。
・同一パッケージの場合は省略でOK
Person[] people = new Person[2];
people[0] = new Person("太郎", 21, "東京都港区");
people[1] = new Person("花子", 18, "北海道札幌市");
・異なるパッケージの場合
net.pgtop.test.Person[] people = new net.pgtop.test.Person[2];
people[0] = new net.pgtop.test.Person("太郎", 21, "東京都港区");
people[1] = new net.pgtop.test.Person("花子", 18, "北海道札幌市");
(3)java.lang パッケージだけは例外
これまで何度も使った String クラスは、JavaのAPI仕様を見ると java.lang パッケージに属しています。正式には「java.lang.String」です。

String クラスは私たちが作ったクラスとは異なるパッケージになります。しかし java.lang パッケージは最も重要なパッケージなので、この中にあるクラスはそのまま使えることになっています。そのため完全修飾名にする必要がなかったのです。