package:私の住所はここですよ
package livingthings; は「私は livingthings に所属しています」という宣言です。他のパッケージからは livingthings.Human という名前で参照できます。
「私のことを他のフォルダから使ってもいいですよ」に近い役割は public です。package は所属先、public は公開範囲を決めます。
Javaの学習用の教材ページです。
4ファイルすべてに package 宣言を書きません。同じ無名パッケージに属するので、別ファイルのクラスも import なしで名前を使えます。
Ape.javaHuman.javaHealthCalculator.javaMain.javaWindows のコマンドプロンプトを pro3 フォルダで開き、次の3行を順に実行します。JDK の javac・java が使える環境が前提です。ファイルは UTF-8 で保存します。
cd 09-v1javac -encoding UTF-8 *.javajava Main4つの .java があるフォルダでコンパイルします。実行には拡張子なしのクラス名 Main を指定します。
public class Ape {
private String name;
public Ape(String name) {
this.name = name;
}
public void eat() {
System.out.println(name + "が食事をします。");
}
}public class Human extends Ape {
private double heightCm;
private double weightKg;
public Human(String name, double heightCm, double weightKg) {
super(name);
this.heightCm = heightCm;
this.weightKg = weightKg;
}
public double getHeightCm() {
return heightCm;
}
public double getWeightKg() {
return weightKg;
}
}public class HealthCalculator {
public double calculateBmi(double heightCm, double weightKg) {
double heightM = heightCm / 100.0;
return weightKg / (heightM * heightM);
}
}public class Main {
public static void main(String[] args) {
Human taro = new Human("太郎", 170, 65);
Human hanako = new Human("花子", 160, 50);
HealthCalculator calculator = new HealthCalculator();
taro.eat();
double taroBmi = calculator.calculateBmi(taro.getHeightCm(), taro.getWeightKg());
System.out.printf("太郎のBMI: %.1f%n", taroBmi);
System.out.println("=====");
hanako.eat();
double hanakoBmi = calculator.calculateBmi(hanako.getHeightCm(), hanako.getWeightKg());
System.out.printf("花子のBMI: %.1f%n", hanakoBmi);
System.out.println("=====");
}
}太郎が食事をします。
太郎のBMI: 22.5
=====
花子が食事をします。
花子のBMI: 19.5
=====taro.eat() と hanako.eat() は Ape から継承したメソッドです。BMI は身長を m に直し、体重 ÷ 身長 ÷ 身長で計算しています。
同じフォルダに置いたから自動で継承されるわけではありません。Human extends Ape と明示して継承し、super(name) で Ape のコンストラクタを呼び出します。
09-v1 を残して、新しく 09-v2 を作ります。役割ごとのフォルダにクラスを置き、package で所属先を宣言します。ここでは import を使わず、別パッケージのクラスを「パッケージ名.クラス名」という完全修飾名で指定します。
speciespackage speciesApe.javalivingthingspackage livingthingsHuman.javacalculatorpackage calculatorHealthCalculator.javamainpackage mainMain.javaWindows のコマンドプロンプトを pro3 フォルダで開き、次の3行を順に実行します。JDK の javac・java が使える環境が前提です。ファイルは UTF-8 で保存します。
cd 09-v2javac -encoding UTF-8 main\Main.java livingthings\Human.java species\Ape.java calculator\HealthCalculator.javajava main.Mainmain フォルダの中には移動しません。4つのフォルダを含む 09-v2 が実行の基準です。java main.Main のドットはパッケージ名とクラス名の区切りです。
package species;
public class Ape {
private String name;
public Ape(String name) {
this.name = name;
}
public void eat() {
System.out.println(name + "が食事をします。");
}
}package livingthings;
public class Human extends species.Ape {
private double heightCm;
private double weightKg;
public Human(String name, double heightCm, double weightKg) {
super(name);
this.heightCm = heightCm;
this.weightKg = weightKg;
}
public double getHeightCm() {
return heightCm;
}
public double getWeightKg() {
return weightKg;
}
}package calculator;
public class HealthCalculator {
public double calculateBmi(double heightCm, double weightKg) {
double heightM = heightCm / 100.0;
return weightKg / (heightM * heightM);
}
}package main;
public class Main {
public static void main(String[] args) {
livingthings.Human taro = new livingthings.Human("太郎", 170, 65);
livingthings.Human hanako = new livingthings.Human("花子", 160, 50);
calculator.HealthCalculator calculator = new calculator.HealthCalculator();
taro.eat();
double taroBmi = calculator.calculateBmi(taro.getHeightCm(), taro.getWeightKg());
System.out.printf("太郎のBMI: %.1f%n", taroBmi);
System.out.println("=====");
hanako.eat();
double hanakoBmi = calculator.calculateBmi(hanako.getHeightCm(), hanako.getWeightKg());
System.out.printf("花子のBMI: %.1f%n", hanakoBmi);
System.out.println("=====");
}
}太郎が食事をします。
太郎のBMI: 22.5
=====
花子が食事をします。
花子のBMI: 19.5
=====taro.eat() と hanako.eat() は Ape から継承したメソッドです。BMI は身長を m に直し、体重 ÷ 身長 ÷ 身長で計算しています。
この例ではフォルダ名をパッケージ名に合わせています。クラス名とフォルダ名は同じでなくて構いません。別パッケージから使うクラス・コンストラクタ・メソッドには public を付けています。
livingthings.Human は livingthings パッケージの Human です。変数の型にも、new の後にも完全な名前を書きます。extends species.Ape も同じ考え方です。
calculator.HealthCalculator calculator の左側は型、右側の calculator は変数名です。先頭の calculator はパッケージ名を表します。
import がなくても、所属先を含む名前でクラスを使えます。フォルダ分けのための package と、名前を短くする import は別の役割です。
09-v2 をコピーして 09-v3 を作ります。フォルダ構成と package はそのままで、Human.java と Main.java に import を追加し、完全修飾名を短いクラス名に置き換えます。表示結果は v2 と同じです。
speciespackage speciesApe.javalivingthingspackage livingthingsHuman.javacalculatorpackage calculatorHealthCalculator.javamainpackage mainMain.javaWindows のコマンドプロンプトを pro3 フォルダで開き、次の3行を順に実行します。JDK の javac・java が使える環境が前提です。ファイルは UTF-8 で保存します。
cd 09-v3javac -encoding UTF-8 main\Main.java livingthings\Human.java species\Ape.java calculator\HealthCalculator.javajava main.Mainmain フォルダの中には移動しません。4つのフォルダを含む 09-v3 が実行の基準です。java main.Main のドットはパッケージ名とクラス名の区切りです。
package species;
public class Ape {
private String name;
public Ape(String name) {
this.name = name;
}
public void eat() {
System.out.println(name + "が食事をします。");
}
}package livingthings;
import species.Ape;
public class Human extends Ape {
private double heightCm;
private double weightKg;
public Human(String name, double heightCm, double weightKg) {
super(name);
this.heightCm = heightCm;
this.weightKg = weightKg;
}
public double getHeightCm() {
return heightCm;
}
public double getWeightKg() {
return weightKg;
}
}package calculator;
public class HealthCalculator {
public double calculateBmi(double heightCm, double weightKg) {
double heightM = heightCm / 100.0;
return weightKg / (heightM * heightM);
}
}package main;
import livingthings.Human;
import calculator.HealthCalculator;
public class Main {
public static void main(String[] args) {
Human taro = new Human("太郎", 170, 65);
Human hanako = new Human("花子", 160, 50);
HealthCalculator calculator = new HealthCalculator();
taro.eat();
double taroBmi = calculator.calculateBmi(taro.getHeightCm(), taro.getWeightKg());
System.out.printf("太郎のBMI: %.1f%n", taroBmi);
System.out.println("=====");
hanako.eat();
double hanakoBmi = calculator.calculateBmi(hanako.getHeightCm(), hanako.getWeightKg());
System.out.printf("花子のBMI: %.1f%n", hanakoBmi);
System.out.println("=====");
}
}太郎が食事をします。
太郎のBMI: 22.5
=====
花子が食事をします。
花子のBMI: 19.5
=====taro.eat() と hanako.eat() は Ape から継承したメソッドです。BMI は身長を m に直し、体重 ÷ 身長 ÷ 身長で計算しています。
この例ではフォルダ名をパッケージ名に合わせています。クラス名とフォルダ名は同じでなくて構いません。別パッケージから使うクラス・コンストラクタ・メソッドには public を付けています。
| v2:完全修飾名 | v3:import 後 |
|---|---|
extends species.Ape | extends Ape |
livingthings.Human | Human |
calculator.HealthCalculator | HealthCalculator |
import はファイルごとに書きます。Human.java では species.Ape、Main.java では livingthings.Human と calculator.HealthCalculator を指定します。Main.java から Ape を直接使っていないので、Ape の import は不要です。
import を追加してもクラスの所属先は変わりません。v2・v3 ともに、実行するクラス名は main.Main です。コマンドは、それぞれの 09-v2・09-v3 フォルダで実行します。
package livingthings; は「私は livingthings に所属しています」という宣言です。他のパッケージからは livingthings.Human という名前で参照できます。
「私のことを他のフォルダから使ってもいいですよ」に近い役割は public です。package は所属先、public は公開範囲を決めます。
コード内で何回も hoge.huga. のようなパッケージ名を書く代わりに、先頭で使うクラスを指定します。例えば import livingthings.Human; と書けば、そのファイルでは livingthings.Human を Human と短く書けます。
| 書き方 | 役割 |
|---|---|
package livingthings; | このクラスの所属先を宣言します。コメントを除いて、import やクラス宣言より前に書きます。 |
import species.Ape; | 別パッケージの species.Ape を、Ape と短く書けるようにします。継承する働きはありません。 |
Human extends Ape | Human が Ape の機能を継承します。「人間は類人猿の一種」という関係を表します。 |
new HealthCalculator() | 計算機の実体(インスタンス)を作ります。Main は計算機を作って使っています。 |
import を書かず、public class Human extends species.Ape と完全な名前で指定することもできます。import はフォルダを読み込んだり、ファイルをコピーしたりする命令ではありません。
v1 の「package も import も不要」は、全ファイルに package 宣言がなく、同じ無名パッケージに属する前提です。
java Main
パッケージ名なしのクラス名
java main.Main
パッケージ名を含むクラス名
javac は .java ファイルから .class ファイルを作ります。この例の java コマンドでは .java や .class、フォルダの区切り文字ではなく、クラス名を指定します。現在のフォルダがクラスパスに含まれる通常の環境を想定しています。CLASSPATH を設定している場合は java -cp . Main または java -cp . main.Main と指定できます。