注目記事

【Javaコード入門】継承、インターフェイス_①extendsキーワード

クラスを継承する – extendsキーワード

[modifier] class name extends sname {
 definition
}
 modifier:修飾子
 name:サブクラスの名前
 sname:スーパークラスの名前
 definition:メンバーの定義

継承(Inheritance)とは、あるクラスの機能を引き継ぎながら新しいクラスを定義することを言います。継承元となるクラスのことスーパークラス、継承の結果できた新しいクラスのことをサブクラスと言います。
継承には、クラスを定義する際にextendsキーワードを付けて継承元を指定します。一度に複数のクラスをまとめて継承することはできませんので注意してください(多重継承の禁止)。
たとえば以下は、Animalクラスを継承したHamsterクラスを定義する例です。以下では、Hamster独自のgnaw(齧る)メソッドを追加しています。

Hamster.java

  1. class Hamster extends Animal {
  2.   public Hamster(String name, String color) {
  3.     super(name, color);
  4.   }
  5.  
  6.   public void gnaw() {
  7.     System.out.println("ガジガジ…");
  8.   }
  9. }

サブクラスではsuperキーワードを利用することで、スーパークラスのコンストラクターやメソッドを参照できます。上の例であれば「super(name, color)」の部分です。
もしもスーパークラスのメソッドを呼び出したいならば、以下のようにします。

  1. super.getInfo("%s:%s");

 

メソッドのオーバーライド
サブクラスでは、(新しいメソッドを追加するだけでなく)スーパークラスで既に存在するメソッドを上書きすることもできます。これをメソッドのオーバーライドと言います。 もしもサブクラスの側で、メソッドをオーバーライドしてほしくない場合には、スーパークラスのメソッドにfinal修飾子を付与してください。

 

関連ページ

補足:コンストラクターの挙動

スーパークラスで定義されたメソッドがサブクラスにそのまま引き継がれるのに対して、コンストラクターはそのままでは引き継がれない点に注意してください。
たとえば以下のようなコードは、意図したように動作しません。

  1. public class SuperClass {
  2.   int value;
  3.  
  4.   public SuperClass(int value) {
  5.     this.value = value;
  6.   }
  7. }
  8.  
  9. public class SubClass extends SuperClass {
  10.   // コンストラクターを定義しない
  11. }

この状態で、スーパークラスのコンストラクターが呼び出されることを期待して、「SubClass sub = new SubClass(10);」のようなコードを書くことはできません。先ほども述べたように、コンストラクターはサブクラスには引き継がれないからです。
では、SubClassクラスを、以下のように書き換えてみるとどうでしょう。

  1. public class SubClass extends SuperClass {
  2.   public SubClass(int value) {
  3.     this.value = value;
  4.   }
  5. }

この場合、同じくサブクラスをインスタンス化した時点で、「暗黙的スーパー・コンストラクター SuperClass() は未定義です。別のコンストラクターを明示的に呼び出す必要があります」のようなエラーとなります。これは、サブクラスがインスタンス化される際に、暗黙的にスーパークラスの引数なしコンストラクターを呼び出そうとしているために生じるエラーです。
これを避けるために、2つの方法があります。
ひとつは、スーパークラスに引数なしのコンストラクターを指定すること、もうひとつは、サブクラスのコンストラクターで明示的にスーパークラスのコンストラクターを呼び出すことです。

  1. public SubClass(int value) {
  2.   super(value);
  3. }

superキーワードで明示的にスーパークラスのコンストラクターを呼び出した場合には、引数なしのコンストラクターは呼び出されなくなりますので、エラーも解消されます。

継承、インターフェイス_目次
extendsキーワード
interface命令
implementsキーワード
無名クラスを定義する
ラムダ式を利用する

監修

山田祥寛(有限会社 WINGSプロジェクト)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NEC にてシステム企画業務に携わるが、2003年 4 月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト(https://wings.msn.to/)」の代表でもある。主な著書に『改訂 3 版JavaScript 本格入門』(技術評論社)、「独習シリーズ(C#・Python・PHP・Ruby・JSP&サーブレットなど)」(翔泳社)、「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravel など)」(Amazon Kindle)など。売り上げの累計は100万部を超える。