【Java開発】第7回 継承

#初めに

皆さん。こんにちは！

DreamHanksの254cmです。

今回は継承について説明していきます。

Java記事のまとめは[こちら](https://qiita.com/DreamHanks/items/6b1996e1f8ed66bbd456)です。

前回の記事は[【Java開発】第6回 コンストラクタ](https://qiita.com/DreamHanks/items/c8e96cf106abb69a1715)です。

##クラスの継承									
継承は既存のクラスに機能を追加したり、再定義して新しいクラスを定義することです。									
継承元のクラスは「基底クラス」、「スーパークラス」、「親クラス」と呼んで									
継承先のクラスは「派生クラス」、「サブクラス」、「子クラス」と呼びます									
									
四角形は正方形、長方形、ひし形などの四角形がありますが、									
上記の正方形、長方形、ひし形は四角形の特性を共有しています。									
ですが、四角形の特性以外にも個別の特性を持っています。									
									
クラスの継承を四角形に例えると四角形は「親クラス」									
正方形、長方形、ひし形は「子供クラス」になります。									

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708649/c7768cff-7109-b759-f70b-05cf11e2fbf0.png)

**サンプル**

動物を親クラスとして、犬と猫を子供クラスとしてプログラムを作成すると、

```java
public class Animal {		
	int lengs;	
	String name;
	
	public void move() {	
        System.out.println("run");		
	}	
}		
		
class Dog extends Animal {		
	public void bark () {	
		System.out.println("wan");
		
	}	
}		
		
class Cat extends Animal {		
	public void cry () {	
		System.out.println("nyaa");
	}	
}	
```
上記のように親クラスを利用して子供クラスを作成することができます。

上記のクラスをほかのクラスで使用してみると、

```java
public class ExcuteClass {

	public static void main(String[] args) {
		Dog d = new Dog();
		Cat c = new Cat();
		
		d.lengs = 4;
		d.name = "ココ";
		d.bark();
		
		c.lengs = 4;
		c.name = "ムギ";
		c.cry();
	}

}
```
上記のようにDogクラスとCatクラスにフィールドを作成しなくても

Animalクラスのフィールドを使用することができます。

##super		
###superとは？		
superは継承元のクラスのインスタンスを参照する変数です。		
thisが自分のインスタンスを参照することと似ています。		

**サンプル**

```java
public class Fruits {				
	String name;			
	String color;			
}				
				
class Lemon extends Fruits {
						
	public void introduce() {			
		System.out.println("name is " + super.name);		
		System.out.println("color is " + super.color);		
	}			
}				
```
上記のようにsuperキーワードを使うと親クラスのフィールドまたはメソッドに接続できます。

##this()とsuper()	
###this()とは？	
this()はコンストラクタの中でほかのコンストラクタを呼び出すメソッドです。	


```java
public class Fruits {					
	String name;				
}					
					
class Lemon extends Fruits {					
					
	String taste;				
	String color;				
					
	public Lemon() {				
		System.out.println("コンストラクタ1");			
	}				
					
	public Lemon(String taste) {				
		this();			
		this.taste = taste;			
		System.out.println("コンストラクタ2");			
	}				
					
	public Lemon(String taste, String color) {				
		this(taste);			
		this.color = color;			
		System.out.println("コンストラクタ3");			
	}				
}					
```
上記のようにthis()キーワードを利用してほかのコンストラクタを呼び出すことができます。

つまり、上記のthis()とthis(taste)はLemon()とLemon(taste)と同じ意味になります。

上記のクラスを下記のようなクラスで生成してると、

```java
public class ExcuteClass {		
	public static void main(String[] args) {	
		Lemon lemon = new Lemon("sour","yellow");
	}	
}		
```

実行結果は

```
コンストラクタ1
コンストラクタ2
コンストラクタ3
```
上記のようになります。

※コンストラクタはクラスのインスタンスが生成されるときに呼び出されるので、

インスタンスの生成が終わっていない時点でほかの処理があればエラーが発生してしまいます。

this()が終了される前にはインスタンスが生成されていない時点です。

つまり、this()の前には処理が存在してはいけません。

###super()とは?

super()はsuperと同じように親クラスのコンストラクタを呼び出すキーワードです。

```java
public class Fruits {			
	String name;		
			
	public Fruits (String name) {		
		this.name = name;	
		System.out.println("親クラスのコンストラクタ");	
	}		
}			
			
class Lemon extends Fruits {			
			
	String taste;		
	String color;		
			
	public Lemon() {		
		super("レモン");	
	}		
}			
			
public class ExcuteClass {			
			
	public static void main(String[] args) {		
		Lemon lemon = new Lemon();	
	}		
}			
```

上記のようにsuper()を使用すると親クラスのコンストラクタを呼び出すことができます。

子供クラスが生成されるとき、子供クラスは親クラスの要素を使うために親クラスの

コンストラクタを呼び出します。今までのサンプルでは親クラスのコンストラクタを

呼び出すサンプルは上記のサンプルしかありませんが、問題なく実行できました。

なぜかというと、子供クラスのコンストラクタにはsuper()が隠されています。

したがって、上記のサンプルのように親クラスのコンストラクタがデフォルトコンストラクタ

あるいは引数を持つコンストラクタではなかった場合、子供クラスで

直接親クラスのコンストラクタを呼び出さなければなりません。

**サンプル1**

```java
public class Fruits {			
	String name;		
}			
			
class Lemon extends Fruits {			
	String taste;		
	String color;		
			
	public Lemon() {		
		super();      //見えないですが、super()が隠されています。	
	}		
}			
```
**サンプル2**

```java
public class Fruits {			
	String name;		
			
	public Fruits() {		
		System.out.println("エラーなし");	
	}		
}			
			
class Lemon extends Fruits {			
			
	String taste;		
	String color;		
			
	public Lemon() {		
		//super()を書かなくてもエラーが発生されない。	
	}		
}			

```
**サンプル3**

```java
public class Fruits {							
	String name;						
							
	public Fruits(String name) {						
		System.out.println("エラーあり");					
	}						
}							
							
class Lemon extends Fruits {							
							
	String taste;						
	String color;						
							
	public Lemon() {     //エラーが発生される						
							
	}						
}							
```

#終わりに

今回の記事は以上になります。

次回はJavaの[配列](https://qiita.com/DreamHanks/items/dc1118e293c6a6286d3a)を学びましょう。

私たちの最新の記事は[こちら](http://blog.dreamhanks.com/java%e5%85%a5%e9%96%80%e8%ac%9b%e5%ba%a7/)で確認することができます。

ご覧いただきありがとうございます。