第二十二章 
 〜クラス編〜
 パッケージ
 パッケージと言うのは、複数のクラスを1つにまとめることができるです。
その大きなまとまりがパッケージです。そしてパッケージの特徴としては階層的
クラスを管理することができるです。なぜ階層的に管理できるかと言うですと、
フォルダの中にJavaのファイルを入れて、それをパッケージとして扱うからです。
そもそも階層と言うのは、今でてきたフォルダにファイルを入れていくことを言うです
そして、そのフォルダの中にまたフォルダを作って行くのが階層っぽいので階層と言う
のですね!WindowsOSで言うとエクスプローラが階層になっているです。
Windowsの階層構造
C:
 /Windows
  /system
   ・abc.txt
 /Program Files
D:
E:

今回のサンプルは第十九章でやったときのクラスを利用してやっていくです。
動物、肉食動物、草食動物もすべて生き物なので生き物というパッケージにまとめる
ことができるです。それだけでなく、パッケージにまとめることによって同じクラス
を複数作ることも可能になるです。

生き物パッケージの肉食動物クラス
ロボットパッケージの肉食動物クラス
これら2つは動物クラスですが、
パッケージの名前が違うので作ることができるというわけですね!

それでは、パッケージの作り方に入って行きたいと思うです。
今回は生き物パッケージ(life)を例にして作って行くです。まずlifeというフォルダを
作ってほしいです。そしてその中に、動物、肉食動物、草食動物のそれぞれのクラスを
作って行くです。lifeというフォルダにできるファイル名は
Animal.javaCarnivorous.javaHerbivorous.javaになるです。
図に表すと・・・(アドレスやjavaのアイコンは人それぞれです。画面はWindowsXPです)

/life(フォルダ名)
 ・Animal.java
 ・Carnivorous.java
 ・Herbivorous.java

それぞれのファイルの中身は次のようになるです。(ほとんど第十九章と同じです)
Animal.java
 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
package life;

public abstract class Animal{
    protected int ryou;

    public int getRyou(){
        return ryou;
    }

    public abstract void eat();
    public abstract String getType();
}

Carnivorous.java
 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
package life;

//肉食動物////////////////////////
public class Carnivorous extends Animal{
    public void eat(){
        System.out.println("肉を食べる");
        ryou = 1000;
    }

    public String getType(){
        return "肉食動物";
    }
}

Herbivorous.java
 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
package life;

//草食動物////////////////////////
public class Herbivorous extends Animal{
    public void eat(){
        System.out.println("草を食べる");
        ryou = 300;
    }

    public String getType(){
        return "草食動物";
    }
}

 これら3つのファイルの1行目に何やら新しいキーワードが登場しているですね! なんとなく名前からしてパッケージですね!このpackageと言うのは、今現在の階層を 書くです、ここでは、lifeというフォルダの中にあるファイルなのでpackage lifeと書 くです。さらにこのpackageと言うのは、かならず1行目に書く必要があるです。(コメ ントを除く)もしimport ・・・を書きたい場合などは、package ・・・の次の行に書けばい いです。  そして、3行目のclassの前にpublicというキーワードが付いているですね!今まで クラスにアクセス修飾子がついていたことなんて無かったはずです。これは一体何を 意味するのかと言うですと。classの前にpublicを付けることによって他のパッケージ からでもアクセス可能なクラスだと言うことを表しているです。そして、1つのjavaの ファイルに1つしか宣言できないです。理由は、publicを付けたクラス名は、ファイル 名でなくてはいけないからです。  他のパッケージと言うのは、ここで言うlife以外のパッケージです。今はまだ作っ てないですが、すぐにこのパッケージを利用するためのファイルを作るです。 それでは次に、lifeフォルダと同じ位置にRei22_1.javaを作って欲しいです。 図に表すと・・・

・Rei22_1.java
/life(フォルダ名)

最終的にはこのようになっているです。



Rei22_1の中身は次のようになっているです。
Rei22_1
 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 14:
 15:
class Rei22_1{
    public static void main(String[] args){
        life.Carnivorous tiger  = new life.Carnivorous();
        life.Herbivorous rabbit = new life.Herbivorous();

        tiger.eat();
        rabbit.eat();

        int cRyou = tiger.getRyou();
        int hRyou = rabbit.getRyou();

        System.out.println(tiger.getType()  + "が食べた量" + cRyou);
        System.out.println(rabbit.getType() + "が食べた量" + hRyou);
    }
}

 まずプログラムの説明をする前に、コンパイルをどこのフォルダでやればいいのかを
説明するです。その場所とは、Rei22_1.javaがある場所でコンパイルして欲しいです。
わたしのパソコンで言うと、javaフォルダの場所でコンパイルするです。そしてコンパ
イルするときは、javac Rei22_1.javaといつもと同じようにやるです。main()メソッド
を持っているクラス名でコンパイルして欲しいと言うことです〜。別にそうでなければ
行けない理由は無いですが、ここではそうして欲しいです。
 3行目と4行目に第19章では、見られなかった物が付いているですね!3行目で言うと
lifeパッケージの中にあるCarnivorousクラスと言う意味になるです。今まではパッケ
ージ名が付いていなかったので、パッケージ名が無かったです。
 そして、異なるパッケージで利用したい場合はpublicをクラスに付けると言ったです
がそれは、ここで発揮してくるです。なぜならRei22_1クラスは、lifeパッケージには
無いですね!つまり違うパッケージと言うことになるです。だからlifeパッケージの
中にあるクラスにはpublicを付けたです。
 Rei22_1は何のパッケージ?と思った人もいるかと思うです。今までは一度もpackage
を宣言したこと無かったですね!そしてこのRei22_1も。これは名前無しパッケージ
無名パッケージと呼ばれているです。そのまんまですね!

パッケー名の省略とimport
 lifeパッケージのCarnivorousクラスにアクセスするときに毎回life.Carnivorousと 書くのは面倒くさいですね!そこでパッケージlifeのCarnivorousクラスを使うと一番 最初に記述すれば省略できるです。具体的には次のサンプルを見て欲しいです。
Rei22_2
 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 14:
 15:
 16:
 17:
 18:
import life.Carnivorous;
import life.Herbivorous;

class Rei22_2{
    public static void main(String[] args){
        Carnivorous tiger  = new Carnivorous();
        Herbivorous rabbit = new Herbivorous();

        tiger.eat();
        rabbit.eat();

        int cRyou = tiger.getRyou();
        int hRyou = rabbit.getRyou();

        System.out.println(tiger.getType()  + "が食べた量" + cRyou);
        System.out.println(rabbit.getType() + "が食べた量" + hRyou);
    }
}

 1,2行目のimportキーワードが、省略させるための宣言です。importは以前何度か登
場したですね!入力をするときにimport java.io.*;で使ったキーワードです。
importを使うことによって、毎回パッケージ名を書く必要がなくなるです。そして、
Rei22_2のimportは、1行に省略することができるです。それは同じパッケージを宣言
するときには*を使って表すことができるです。
import life.*;
 import java.io.*;のときは、javaパッケージの中のioパッケージの中のクラスを使
うと言う意味です。


今回のポイント
@ パッケージは、複数のクラスを1つにまとめられる。
A パッケージは、階層構造になっている。
B パッケージにすることによって同じクラス名が書ける。
C パッケージにまとめるには、フォルダと同じ名前をpackageの後に書く
  例:フォルダ名:lifeだったら package life; //コメントを除く1行目に書く
D パッケージ.クラス名と毎回書くと面倒な場合importを使う
  import パッケージ名.クラス名;
  複数のクラスを使いたい場合は*を使う
  import パッケージ名.*;
E classにpublicを付けることによって違うパッケージからクラスを利用できるように
  なる。

TOPに戻る   Java講座に戻る