【Java】クラスの継承

2018年3月11日

本稿はクラスの継承について説明していきます。

クラスを継承すると継承したクラスは、元のクラスの能力を、そのまま引き継ぐことができるのです。

継承される側のクラスをスーパークラスといい、継承したクラスをサブクラスといいます。

クラスを継承する

クラスを継承するには「class クラス名 extends 継承したいクラス名」と記述します。

public class Test{
	public static void main(String[] args){
		Cat cat = new Cat();
		System.out.println(cat.power);
	}

}
class Animal{
	int power=100;
}
class Cat extends Animal{
	
}
実行結果

100

CatクラスはAnimalクラスを継承しています。
Animalクラスの能力を引き継いだので、Cat型もpower変数を使用可能です。


当然メソッドも引き継げます。

public class Test{
	public static void main(String[] args){
		Cat cat = new Cat();
		cat.run();
	}

}
class Animal{
	void run(){
		System.out.println("走りました。");
	}
}
class Cat extends Animal{
	int power=200;
}
実行結果

走りました。

引き継いだメソッドや変数は子クラスでも使用できていることがわかると思います。

superで親クラスを明示的に示す。

同じ変数名やメソッド名を使用していて、親クラスを明示したい場合は「super.変数名またはメソッド名」と記述します。

public class Test{
	public static void main(String[] args){
		Cat cat = new Cat();
		cat.run(50);
	}

}
class Animal{
	int power=100;
}
class Cat extends Animal{
	int power=200;
	void run(int power){
		System.out.println(power);//引数のpower
		System.out.println(this.power);//Catのpower
		System.out.println(super.power);//Animalのpower
	}
}
実行結果

50
200
100

thisやsuperを使用しない場合の優先順位は
1.ブロック変数
2.自身クラスの変数
3.親クラスの変数
の順に高いです。


メソッドの場合も同じように明示することができます。

public class Test{
	public static void main(String[] args){
		Cat cat = new Cat();
		cat.run();
	}

}
class Animal{
	int power=100;
	void run(){
		System.out.println(power);//自身のpower
	}
}
class Cat extends Animal{
	int power=200;
	void run(){
		super.run();//Animalのrun
	}
}
実行結果

100

スーパークラスのコンストラクタ

クラスのオブジェクトを作成したときはコンストラクタが呼ばれるわけですが、継承したサブクラスは必ずスーパークラスのコンストラクタも呼び出されます。

もし、スーパークラスのコンストラクタがオーバーロードされていたらどれが呼び出されるのか、わからなくなってしまいます。

そんな時はコンストラクタの最初でsuper(引数…)と指定すると明示的に呼び出しを変更できます。

注意しなければならないのは、super()が呼び出せるのは、コンストラクタの最初だけです。

途中で呼び出すとエラーになってしまいます。

また、superが明示されていない場合は、デフォルトコンストラクタが暗黙的に呼び出されます。

それではsuperを利用して親クラスのコンストラクタを呼び出してみましょう。

public class Test{
	public static void main(String[] args){
		new Latifa();
	}
}

class Chara{
	Chara(String name){
		System.out.println(name+"が生成されました。");
	}
	Chara(String name, int hp){
		System.out.println(name+"のHPは"+hp+"です。");
	}
}

class Latifa extends Chara{
	Latifa(){
		super("ラティファ");
	}
}
実行結果

ラティファが生成されました。

super(“ラティファ”);と指定したので引数が一つのコンストラクタが呼び出されていますね。

super(“ラティファ”,100);の場合はもう一つのほうのコンストラクタが呼び出されるはずです。

Java継承

Posted by nompor