はじめに
java初心者が備忘録的に書いています
継承のキホン
javaの醍醐味ともいえる継承。書き方自体は簡単。今回は基本的な継承について書いていく。
結論から言うと書き方は以下のようである。
public class hoge extends 継承元クラス {
public void sample(){
//処理内容
//super.親クラスのメソッド名 これで親クラスのメソッドを使用できる
}
}
子クラスは「super.親クラスのメソッド名」とかくことで親クラスのメソッドを使用できる。
もっとわかりやすく具体例を挙げてみる。
public class Parents {
public void parents(){
System.out.print("親クラスだよ");
}
}
public class Child extends Parents {
public void child() {
super.parents();
}
}
Childクラス内のchildメソッドを呼び出すと親クラスの「親クラスだよ」が出力される。
継承のコンストラクタ
次は親クラスがコンストラクタを持つ場合の継承の書き方。
まず先ほどと同じように書いてみる。
public class Child extends Parents {
public void child() {
super.parents();
}
}
public class Parents {
String str;
public Parents(String a){
str = a;
}
public void parents() {
System.out.println(str);
}
}
先ほどと同じように書いてみた。しかしこのままではコンパイルエラーが起きてしまう。
暗黙的スーパー・コンストラクター Parents() は、デフォルト・コンストラクターについては未定義です。
明示的コンストラクターを定義する必要があります
このコードとエラー文をよくよく見てみると親クラスであるParentsのコンストラクタが未定義なことがわかる。
では子クラスから親クラスのコンストラクタを行うにはどうしたらよいのか。ここで登場するのがsuperである。(さきほどでてきたsuper.親クラスのメソッド名の使い方とは別なので混同しないように)
書き方としては以下のようである。
public class Child extends Parents {
public Child() {
super("親クラスだよ");//コンストラクタを用いて初期化
}
public void child() {
super.parents();
}
}
このように書くことで親クラスのコンストラクタを行うことができる。
少し踏み入った話~super~
実は子クラスで継承を行うとき必ず親クラスのコンストラクタが行われているのである。
継承のキホンで説明したコードを例に挙げてみる。
public class Parents {
public void parents(){
System.out.print("親クラスだよ");
}
}
public class Child extends Parents {
public void child() {
super.parents();
}
}
この親クラスはコンストラクタが行われていない。そのため子クラスでsuper();と記述はしていない。
しかしコンパイラがコードを読むときにかってに以下のように解釈しているのである。
public class Child extends Parents {
//---じつはここが追加されている---
public Child(){
super();
}
//-------------------------------
public void child() {
super.parents();
}
}
このため親クラスがコンストラクタを持っている場合は「引数のないコンストラクタをおこなっている(コンストラクタは引数が必要なのに、、、)」ためエラーがでるのである。
最後に
継承自体を使うことはすぐ慣れるが、なにを親クラスとして何を子クラスとするのかなど設計が難しいと感じた