0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

java初心者が行く~継承1~

Last updated at Posted at 2023-05-08

はじめに

java初心者が備忘録的に書いています

継承のキホン

javaの醍醐味ともいえる継承。書き方自体は簡単。今回は基本的な継承について書いていく。
結論から言うと書き方は以下のようである。

public class hoge extends 継承元クラス {
    public void sample(){
        //処理内容
        //super.親クラスのメソッド名 これで親クラスのメソッドを使用できる
    }
}

子クラスは「super.親クラスのメソッド名」とかくことで親クラスのメソッドを使用できる。
もっとわかりやすく具体例を挙げてみる。

Parents.java
public class Parents {

    public void parents(){
        System.out.print("親クラスだよ");
    }
}
Child.java
public class Child extends Parents {

	public void child() {
		super.parents();
	}
}

Childクラス内のchildメソッドを呼び出すと親クラスの「親クラスだよ」が出力される。

継承のコンストラクタ

次は親クラスがコンストラクタを持つ場合の継承の書き方。
まず先ほどと同じように書いてみる。

Child.java
public class Child extends Parents {
	public void child() {
		super.parents();
	}
}
Child.java
public class Parents {
	String str;

    public Parents(String a){
    	str = a;
    }

    public void parents() {
    	System.out.println(str);
    }
}

先ほどと同じように書いてみた。しかしこのままではコンパイルエラーが起きてしまう。

コンパイルエラー
暗黙的スーパー・コンストラクター Parents() は、デフォルト・コンストラクターについては未定義です。
明示的コンストラクターを定義する必要があります

このコードとエラー文をよくよく見てみると親クラスであるParentsのコンストラクタが未定義なことがわかる。
では子クラスから親クラスのコンストラクタを行うにはどうしたらよいのか。ここで登場するのがsuperである。(さきほどでてきたsuper.親クラスのメソッド名の使い方とは別なので混同しないように)

書き方としては以下のようである。

Child.java
public class Child extends Parents {

	public Child() {
		super("親クラスだよ");//コンストラクタを用いて初期化
	}
	public void child() {
		super.parents();
	}
}

このように書くことで親クラスのコンストラクタを行うことができる。

少し踏み入った話~super~

実は子クラスで継承を行うとき必ず親クラスのコンストラクタが行われているのである。
継承のキホンで説明したコードを例に挙げてみる。

Parents.java
public class Parents {

    public void parents(){
        System.out.print("親クラスだよ");
    }
}
Child.java
public class Child extends Parents {

	public void child() {
		super.parents();
	}
}

この親クラスはコンストラクタが行われていない。そのため子クラスでsuper();と記述はしていない。
しかしコンパイラがコードを読むときにかってに以下のように解釈しているのである。

Child.java
public class Child extends Parents {

//---じつはここが追加されている---
	public Child(){
		super();
	}
//-------------------------------
	public void child() {
		super.parents();
	}
}

このため親クラスがコンストラクタを持っている場合は「引数のないコンストラクタをおこなっている(コンストラクタは引数が必要なのに、、、)」ためエラーがでるのである。

最後に

継承自体を使うことはすぐ慣れるが、なにを親クラスとして何を子クラスとするのかなど設計が難しいと感じた

0
0
2

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?