Java の super キーワードとは?親クラスのメソッドを呼び出す方法を初心者向けにやさしく解説
新人
「Javaで親クラスのメソッドを呼び出したいときって、どうすればいいんですか?」
先輩
「そのときはsuperというキーワードを使うんだ。親クラスのメソッドを呼び出すのに使える便利な仕組みだよ。」
新人
「スーパっていうんですね!具体的にどう使うのか教えてください!」
先輩
「じゃあ、superキーワードの基本から見ていこう!」
1. superキーワードとは?(意味と使い方の基本)
Javaのsuperキーワードは、子クラスから親クラスのメソッドを呼び出したいときに使います。Javaでは、親子関係のあるクラスで、同じ名前のメソッドを持つことがよくあります。
そんなとき、子クラスでsuper.メソッド名()と書くと、親クラスのメソッドを明確に指定して呼び出すことができます。
次の例では、親クラスのsayHello()を子クラスでsuperを使って呼び出しています。
public class Parent {
void sayHello() {
System.out.println("こんにちは、親クラスです。");
}
}
public class Child extends Parent {
void sayHello() {
super.sayHello(); // 親クラスのメソッドを呼び出す
System.out.println("こんにちは、子クラスです。");
}
}
public class Main {
public static void main(String[] args) {
Child child = new Child();
child.sayHello();
}
}
こんにちは、親クラスです。
こんにちは、子クラスです。
このように、super.sayHello()を書くことで、子クラスから親クラスのメソッドを呼び出すことができます。
2. 親クラスのメソッドを呼び出すとはどういうこと?
親クラスのメソッドを呼び出すというのは、すでに親クラスで用意されている処理を、そのまままたは一部だけ使いたいときに行うことです。
たとえば、同じようなメッセージを表示する処理や、ログイン処理、共通のチェック処理などを親クラスに書いておいて、子クラスではそれを活用しながら、追加の動作を行うという形です。
現実の例にたとえると、「あいさつをする」という行動を親クラスに書いておいて、「あいさつしてから自分の名前を言う」という動作を子クラスで追加するようなものです。
public class Greeting {
void sayHi() {
System.out.println("こんにちは!");
}
}
public class PersonalGreeting extends Greeting {
void sayHi() {
super.sayHi(); // 親クラスのsayHiを呼び出す
System.out.println("私はタナカです。");
}
}
public class Main {
public static void main(String[] args) {
PersonalGreeting pg = new PersonalGreeting();
pg.sayHi();
}
}
こんにちは!
私はタナカです。
このように、親クラスの処理を使いながら、子クラスで追加のメッセージを表示することができます。これがJavaのsuperを使った親クラスのメソッド呼び出しの基本的な考え方です。
親の動きも活かしながら、自分の動きを加えたいときにsuperはとても便利です。
3. superでメソッドを呼び出す基本の書き方
Javaでsuperを使って親クラスのメソッドを呼び出すときは、super.メソッド名()と書きます。これだけで、子クラスの中から親クラスのメソッドを実行できます。
まずはシンプルな例を見てみましょう。
public class Animal {
void introduce() {
System.out.println("これは動物です。");
}
}
public class Dog extends Animal {
void introduce() {
super.introduce();
System.out.println("これは犬です。");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.introduce();
}
}
これは動物です。
これは犬です。
このように、子クラスのDogがsuper.introduce()を使って、親クラスAnimalのintroduceメソッドを呼び出し、そのあとに自分の動作を続けることができます。
4. 親クラスの動きを活かして子クラスを拡張する例
Javaのsuperキーワードを使うことで、親クラスの共通処理を活かしながら、子クラスで独自の動作を追加できます。
たとえば、ゲームのキャラクターが「動く」という動作を親クラスに持ち、それぞれのキャラで独自の動き方を追加したいときに便利です。
public class Character {
void move() {
System.out.println("キャラクターが動きます。");
}
}
public class Hero extends Character {
void move() {
super.move();
System.out.println("ヒーローが走ります。");
}
}
public class Monster extends Character {
void move() {
super.move();
System.out.println("モンスターがゆっくり歩きます。");
}
}
public class Main {
public static void main(String[] args) {
Hero hero = new Hero();
Monster monster = new Monster();
hero.move();
monster.move();
}
}
キャラクターが動きます。
ヒーローが走ります。
キャラクターが動きます。
モンスターがゆっくり歩きます。
このように、共通の処理は親クラスに書いて、それをsuperで呼び出しながら、子クラスで動きを追加すれば、重複せずきれいなコードになります。
5. superとthisの違いを簡単に理解しよう
Javaを勉強していると、superとよく似たキーワードにthisがあります。この二つの違いを混乱する人は多いですが、簡単に覚える方法があります。
superは「親クラスのものを使う」ときに使います。一方で、thisは「自分のクラスのものを使う」ときに使います。
次の例で見てみましょう。
public class Parent {
String name = "親";
void showName() {
System.out.println("名前: " + name);
}
}
public class Child extends Parent {
String name = "子";
void showName() {
System.out.println("this.name: " + this.name);
System.out.println("super.name: " + super.name);
}
}
public class Main {
public static void main(String[] args) {
Child c = new Child();
c.showName();
}
}
this.name: 子
super.name: 親
このように、this.nameは子クラスのnameを、super.nameは親クラスのnameを指しています。
この違いを意識しておけば、Javaでsuperとthisを使い分けるときに迷いません。
superは親、thisは自分と覚えておきましょう。
6. superを使うときの注意点(メソッド名の間違いなど)
Javaでsuperを使うとき、親クラスのメソッド名や引数の形を間違えると、うまく呼び出せません。とくに初心者はスペルミスに気づかず、思ったように動かないことがあります。
たとえば、次のように親クラスにshowInfoというメソッドがあるのに、super.showinfo()と書いてしまうと、エラーになります。
public class Parent {
void showInfo() {
System.out.println("親の情報を表示します。");
}
}
public class Child extends Parent {
void showInfo() {
super.showinfo(); // showinfoは小文字でミス!
System.out.println("子の情報を表示します。");
}
}
このようなとき、Javaはshowinfoという名前のメソッドが親に無いと判断して、コンパイルエラーになります。
間違いを防ぐためには、親クラスのメソッド名を確認したり、オーバーライド時に@Overrideをつけることで、間違いがあればすぐに教えてくれるので安心です。
7. コンストラクタでもsuperは使える(簡単な紹介)
Javaのsuperは、メソッドだけでなく、コンストラクタにも使うことができます。コンストラクタとは、クラスが作られたときに最初に実行される特別なメソッドのことです。
親クラスにコンストラクタがあるとき、子クラスでそれを呼び出すにはsuper()を使います。
public class Parent {
Parent(String name) {
System.out.println("親クラス: " + name);
}
}
public class Child extends Parent {
Child(String name) {
super(name); // 親クラスのコンストラクタを呼び出す
System.out.println("子クラス: " + name);
}
}
public class Main {
public static void main(String[] args) {
Child c = new Child("タナカ");
}
}
親クラス: タナカ
子クラス: タナカ
このように、親クラスのコンストラクタで何か準備をしたいとき、それをsuper()で呼び出せば、子クラスでもその準備が活かせるというわけです。
8. 初心者向け!superを使ったコード設計のヒント
これまで見てきたように、Javaのsuperは、親クラスの機能をうまく活かすための道具です。
コードを設計するとき、「共通の処理は親クラスにまとめて書く」「子クラスでは追加や変更だけを書く」という考え方をすると、コードがきれいでわかりやすくなります。
たとえば、複数のクラスで「同じあいさつ」や「ログ表示」などをするなら、それは親クラスに書いて、子クラスではsuperで呼び出すようにします。
このようにすれば、コードの重複を減らせるだけでなく、あとで変更が必要になったときも親クラスだけを直せばよいので、とても楽になります。
Javaの学習を進めていくと、クラスの設計力がとても大切になります。superを使って親の機能を活かすという考え方を、今のうちから身につけておくと、後でとても役立ちます。