Coordinate3D.java
package jp.ac.utsunomiya_u.is;
public class Coordinate3D extends Coordinate {
/**
* Z座標
*/
private double z = 0.0;
/**
* コンストラクタ(デフォルト)
*/
Coordinate3D() {
super();
z = 0.0;
}
/**
* コンストラクタ
*
* @param x X座標
* @param y Y座標
* @param z Z座標
*/
Coordinate3D(double x, double y, double z) {
super(x, y);
this.z = z;
}
/**
* コンストラクタ(コピー)
*
* @param coordinate3D 3次元座標インスタンス
*/
Coordinate3D(Coordinate3D coordinate3D) {
super(coordinate3D.getX(), coordinate3D.getY());
this.z = coordinate3D.z;
}
/**
* セッタ for Z座標
*
* @param z Z座標
*/
void setZ(double z) {
this.z = z;
}
/**
* セッタ for X-Y-Z座標
*
* @param x X座標
* @param y Y座標
* @param z Z座標
*/
void set(double x, double y, double z) {
super.set(x, y);
this.z = z;
}
/**
* ゲッタ for Z座標
*
* @return Z座標
*/
double getZ() {
return z;
}
}
Coordinate3DTest.java
package jp.ac.utsunomiya_u.is;
public class Coordinate3DTest {
public static void main(String[] args) {
Coordinate3D coordinate3D = new Coordinate3D(1, 2, 3);
System.out.println("x = " + coordinate3D.getX() + " y = " + coordinate3D.getY() + " z = " + coordinate3D.getZ());
coordinate3D.set(4, 5, 6);
System.out.println("x = " + coordinate3D.getX() + " y = " + coordinate3D.getY() + " z = " + coordinate3D.getZ());
coordinate3D.setX(7);
coordinate3D.setY(8);
coordinate3D.setZ(9);
System.out.println("x = " + coordinate3D.getX() + " y = " + coordinate3D.getY() + " z = " + coordinate3D.getZ());
}
}
出力
x = 1.0 y = 2.0 z = 3.0 x = 4.0 y = 5.0 z = 6.0 x = 7.0 y = 8.0 z = 9.0
class ChildClass extends FatherClass, MotherClassとすることは出来ません.
class Coordinate3D extends public Coordinateのように書けません.
final class Coordinate3D extends CoordinateとするとCoordinate3Dクラスを継承したサブクラスは定義出来ません. 継承させたくないクラスの場合,final修飾子をつけましょう. 例えば,文字列を扱うクラスStringクラスはfinal修飾子がついていいるので,継承して新しいクラスを作ることは出来ません.
Vehicle.java
package jp.ac.utsunomiya_u.is;
public class Vehicle {
void printEnergySource() {
System.out.println("I am powered by gasoline.");
}
}
VehicleクラスはprintEnergySourceというメソッドを持っています(他は省略しています).
これをスーパークラスとして継承したElectricVehicleクラスを次のようにしてみましょう.
ElectricVehicle.java
package jp.ac.utsunomiya_u.is;
public class ElectricVehicle extends Vehicle {
@Override
void printEnergySource() {
System.out.println("I am powered by electricity.");
}
}
ElectricVehicleは既にあるVehicleを継承したいのですが,printEnergySourceメソッドの名前や引数を変えずに動作を変更したいとします.
このような場合,スーパークラスと同一名,同一引数(この例では引数はありません)でメソッドを再定義出来ます.
これを「オーバーライド」と言います.
| 表記 | 意味 |
|---|---|
| @Deprecated | 非推奨扱い |
| @Override | オーバーライド |
| @SuppressWarnings | 警告メッセージ抑制 |
PlugInHybridVehicle.java
package jp.ac.utsunomiya_u.is;
public class PlugInHybridVehicle extends ElectricVehicle {
@Override
void printEnergySource() {
System.out.println("I am powered by galoline and electricity.");
}
}
VehicleTest.java
package jp.ac.utsunomiya_u.is;
public class VehicleTest {
public static void main(String[] args) {
Vehicle vehicle = new Vehicle();
vehicle.printEnergySource();
ElectricVehicle electricVehicle = new ElectricVehicle();
electricVehicle.printEnergySource();
PlugInHybridVehicle plugInHybridVehicle = new PlugInHybridVehicle();
plugInHybridVehicle.printEnergySource();
}
}
それぞれのインスタンスでprintEnergySourceを呼んでみると以下のような出力を得ます.
出力
I am powered by gasoline. I am powered by electricity. I am powered by galoline and electricity.
Coordinate3DTest.javaへの追加部分
System.out.println(coordinate3D.toString());を追加して,動作を確認してみましょう.
出力
jp.ac.utsunomiya_u.is.Coordinate3D@15db9742
Coordinate3D.javaへの追加部分
/**
* toStringのオーバーライド
*
* @return X-Y-Z座標の文字列
*/
@Override
public String toString() {
return "(" + getX() + ", " + getY() + ", " + getZ() + ")";
}
出力
(7.0, 8.0, 9.0)
VehicleTest.javaへの追加部分
package jp.ac.utsunomiya_u.is;
public class VehicleTest {
static class NaturalGasVehicle extends Vehicle {
@Override
void printEnergySource() {
System.out.println("I am powered by natural gas.");
}
}
public static void main(String[] args) {
Vehicle vehicle = new Vehicle();
vehicle.printEnergySource();
ElectricVehicle electricVehicle = new ElectricVehicle();
electricVehicle.printEnergySource();
PlugInHybridVehicle plugInHybridVehicle = new PlugInHybridVehicle();
plugInHybridVehicle.printEnergySource();
NaturalGasVehicle naturalGasVehicle = new NaturalGasVehicle();
naturalGasVehicle.printEnergySource();
}
}
InnerClassTest.java
package jp.ac.utsunomiya_u.is;
import jp.ac.utsunomiya_u.is.test.OuterClassTest;
public class InnerClassTest {
InnerClassTest() {
new InnerClassPrivate();
new InnerClassPackagePrivate();
new InnerClassProtected();
new InnerClassPublic();
new InnerClassPrivateStatic();
new InnerClassPackagePrivateStatic();
new InnerClassProtectedStatic();
new InnerClassPublicStatic();
//new OuterClassTest.InnerClassPrivate(); // privateメンバーにクラス外部からアクセスできません
//new OuterClassTest.InnerClassPackagePrivate(); // publicでないメンバーにパッケージ外部からアクセスできません
//new OuterClassTest.InnerClassProtected(); // publicでないメンバーにパッケージ外部からアクセスできません
//new OuterClassTest.InnerClassPublic(); // 非staticメンバーのインナークラスをインスタンス化するためには,一度アウタークラスのインスタンスを生成しなければなりません
OuterClassTest outerClassTest = new OuterClassTest();
OuterClassTest.InnerClassPublic innerClassPublic = outerClassTest.new InnerClassPublic();
//new OuterClassTest.InnerClassPrivateStatic(); // privateメンバーにクラス外部からアクセスできません
//new OuterClassTest.InnerClassPackagePrivateStatic(); // publicでないメンバーにパッケージ外部からアクセスできません
//new OuterClassTest.InnerClassProtectedStatic(); // publicでないメンバーにパッケージ外部からアクセスできません
new OuterClassTest.InnerClassPublicStatic();
}
private class InnerClassPrivate {
InnerClassPrivate() {
System.out.println(getClass().getName());
}
};
class InnerClassPackagePrivate {
InnerClassPackagePrivate() {
System.out.println(getClass().getName());
}
};
protected class InnerClassProtected {
InnerClassProtected() {
System.out.println(getClass().getName());
}
}
public class InnerClassPublic {
public InnerClassPublic() {
System.out.println(getClass().getName());
}
}
private static class InnerClassPrivateStatic {
InnerClassPrivateStatic() {
System.out.println(getClass().getName());
}
};
static class InnerClassPackagePrivateStatic {
InnerClassPackagePrivateStatic() {
System.out.println(getClass().getName());
}
};
protected static class InnerClassProtectedStatic {
InnerClassProtectedStatic() {
System.out.println(getClass().getName());
}
}
public static class InnerClassPublicStatic {
public InnerClassPublicStatic() {
System.out.println(getClass().getName());
}
}
public static void main(String[] args) {
System.out.println("##### Inner Class Test #####");
new InnerClassTest();
System.out.println("##### Outer Class Test #####");
new OuterClassTest();
System.out.println("##### Static Class Test #####");
//new InnerClassPrivate(); // staticメソッドから非staticメンバーにアクセスできません
//new InnerClassPackagePrivate(); // staticメソッドから非staticメンバーにアクセスできません
//new InnerClassProtected(); // staticメソッドから非staticメンバーにアクセスできません
//new InnerClassPublic(); // staticメソッドから非staticメンバーにアクセスできません
new InnerClassPrivateStatic();
new InnerClassPackagePrivateStatic();
new InnerClassProtectedStatic();
new InnerClassPublicStatic();
System.out.println("##### Local Class Test #####");
int i = 0;
final int f = 0;
class LocalClass {
public LocalClass() {
//i = 1; // ローカルクラス内からアウターメソッドのローカル変数にアクセスすることは出来ません
System.out.println(f);
System.out.println(getClass().getName());
}
}
new LocalClass();
}
}
OuterClassTest.java
package jp.ac.utsunomiya_u.is.test;
public class OuterClassTest {
private int i = 0;
private static int s = 0;
public OuterClassTest() {
new InnerClassPrivate();
new InnerClassPackagePrivate();
new InnerClassProtected();
new InnerClassPublic();
new InnerClassPrivateStatic();
new InnerClassPackagePrivateStatic();
new InnerClassProtectedStatic();
new InnerClassPublicStatic();
}
private class InnerClassPrivate {
//private static int ss =0; // staticフィールドは利用できません
InnerClassPrivate() {
i = 1;
s = 1;
System.out.println(getClass().getName());
}
};
class InnerClassPackagePrivate {
InnerClassPackagePrivate() {
i = 1;
s = 1;
System.out.println(getClass().getName());
}
};
protected class InnerClassProtected {
InnerClassProtected() {
i = 1;
s = 1;
System.out.println(getClass().getName());
}
}
public class InnerClassPublic {
public InnerClassPublic() {
i = 1;
s = 1;
System.out.println(getClass().getName());
}
}
private static class InnerClassPrivateStatic {
private static int ss = 0;
InnerClassPrivateStatic() {
//i = 1; // 非staticメンバークラスはアウタークラスの非staticフィールドにアクセスできません
s = 1;
System.out.println(getClass().getName());
}
};
static class InnerClassPackagePrivateStatic {
InnerClassPackagePrivateStatic() {
//i = 1; // 非staticメンバークラスはアウタークラスの非staticフィールドにアクセスできません
s = 1;
System.out.println(getClass().getName());
}
};
protected static class InnerClassProtectedStatic {
InnerClassProtectedStatic() {
//i = 1; // 非staticメンバークラスはアウタークラスの非staticフィールドにアクセスできません
s = 1;
System.out.println(getClass().getName());
}
}
public static class InnerClassPublicStatic {
public InnerClassPublicStatic() {
//i = 1; // 非staticメンバークラスはアウタークラスの非staticフィールドにアクセスできません
s = 1;
System.out.println(getClass().getName());
}
}
}
| staticメンバークラス | アウタークラスのインスタンスを生成しなくいてもインスタンスを生成出来ます.staticメンバーにアクセスできます. |
|---|---|
| 非staticメンバークラス | アウタークラスをインスタンス化しないとインスタンスを生成出来ません.staticメンバーにアクセスできません. |
| ローカルクラス | メソッド内で定義されます.ローカル変数がそうであるように,static修飾子とアクセス修飾子(private, protected, public)をつけることはできません. |
| 匿名クラス | 次節参照 |
VehicleTest.javaへの追加部分
package jp.ac.utsunomiya_u.is;
public class VehicleTest {
static class NaturalGasVehicle extends Vehicle {
@Override
void printEnergySource() {
System.out.println("I am powered by natural gas.");
}
}
public static void main(String[] args) {
Vehicle vehicle = new Vehicle();
vehicle.printEnergySource();
ElectricVehicle electricVehicle = new ElectricVehicle();
electricVehicle.printEnergySource();
PlugInHybridVehicle plugInHybridVehicle = new PlugInHybridVehicle();
plugInHybridVehicle.printEnergySource();
NaturalGasVehicle naturalGasVehicle = new NaturalGasVehicle();
naturalGasVehicle.printEnergySource();
Vehicle vehicle2 = new Vehicle() {
@Override
void printEnergySource() {
System.out.println("I am powered by water.");
}
};
vehicle2.printEnergySource();
}
}