Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

More than 1 year has passed since last update.

クラスの継承

Last updated at Posted at 2022-04-22

クラスの継承

クラスを定義する際に、クラス名+extends+基底クラス名とすることでクラスを継承し、その機能を使うことができる。

superキーワード

子クラスから親クラスのメソッドやフィールド、コンストラクタへアクセスするために用いる。
共通する処理は親クラスのメソッドに記述し、superで参照する。

sample.java
public class Sample {

	public static void main(String[] args) {
		
		GasolineCar g = new GasolineCar("赤");
		HybridCar h = new HybridCar("白");
		
		g.drive(1.0);
		h.drive(2.0);
		
	}
}
Car.java
//基底クラス
public class Car {
	
	double distance = 0.0; //総走行距離
	String color = "";

	//コンストラクタ
	public Car(String color) {
		this.color = color;
	}
	
	public void drive(double d) {
		
		distance +=d;
		
	}

}
GasolineCar.java
// extendsで継承
public class GasolineCar extends Car{
	
	public GasolineCar(String color) {
		super(color);//親クラスCarのコンストラクタを参照
	}
	
	public void drive(double d) {
			
		super.drive(d);//親クラスのdriveメソッドを呼び出す
		System.out.println("-----------------------");
		System.out.println("ぶーん");
		System.out.println("ガソリンを消費して"+d+"km走行しました。");
		System.out.println("マイレージは、"+distance+"kmです。");
		}


}
HybridCar.java
public class HybridCar extends Car {
	
	public HybridCar(String color) {
		super(color);
	}
	
	public void drive(double d) {
		
		super.drive(d);
		System.out.println("-----------------------");
		System.out.println("すいーん");
		System.out.println(d+"km走行しました。燃費もいいですよ");
		System.out.println("マイレージは、"+distance+"kmです。");
	}


}

抽象クラスと抽象メソッド

抽象化インスタンス化できないクラスで、abstractを先頭につけて定義する。
継承してより具体性の高いクラスを作らないと使用できない。

抽象メソッドは、メソッド名や受け取るパラメータ、返す値の型は書かれているが、処理ブロックは書かれていないメソッドのことである。継承したクラスで実装し、処理を記述する。
抽象メソッドを1つでも持つクラスは抽象クラスであり、クラス名の前にabstractをつける必要がある。
サブクラスにあるメソッドを必ず持たせたいという場合は、スーパークラスに抽象メソッドとして定義しておく。

Sample.java
public class Sample {

	public static void main(String[] args) {

		Praus p = new Praus("グレー");

		p.drive(1.0);
		p.drive(5.0);
		p.drive(100.0);

	}
}
Car.java
//抽象化クラスの定義
abstract public class Car {

	double distance = 0.0; // 総走行距離
	String color = "";

	public Car(String color) {
		this.color = color;
	}

	public void drive(double d) {

		distance += d;

	}

}
GasolineCar.java
abstract public class GasolineCar extends Car {

	public GasolineCar(String color) {
		super(color);
	}

	public void drive(double d) {

		super.drive(d);
		this.useGasoline(d);

	}
 
    // 抽象メソッドの定義
	abstract void useGasoline(double d);

}
HybridCar.java
abstract public class HybridCar extends Car {

	public HybridCar(String color) {
		super(color);
	}

	public void drive(double d) {

		super.drive(d);
		this.useEnergy(d);

	}

	abstract void useEnergy(double d); 

}
Praus.java
//抽象クラスの継承
public class Praus extends HybridCar {

	public Praus(String color) {
		super(color);
	}
     
    //抽象メソッドの実装
	@Override
	void useEnergy(double d) {
		System.out.println(d + "km走行するための燃料を使いました。");
	}

	@Override
	public void drive(double d) {
		System.out.println("--------------------------------");
		System.out.println(this.color + "のプラウスが走っています。");
		super.drive(d);//親クラスであるHybridCarクラスのdriveメソッドが実行される
	}

}

結果
--------------------------------
グレーのプラウスが走っています
1.0km走行するための燃料を使いました
--------------------------------
グレーのプラウスが走っています
5.0km走行するための燃料を使いました
--------------------------------
グレーのプラウスが走っています
100.0km走行するための燃料を使いました

上記例でのクラスの関係は、下の図の通り。
クラス関係.png

0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?