継承の禁止 - final - 萌えJava超入門
クラスの継承

継承の禁止

final をつけたメソッドは、オーバーライドできません
final をつけたクラスは、継承できません。

final

萌えJava超入門 萌えJava超入門 萌えJava超入門
この辺は
軽く流していいぞ?
目次

1. finalメソッドはオーバライドできない

final 修飾子は以前
「final 修飾子を付与した変数は、値の変更ができない 定数 になる」
と紹介させていただきました。

萌えJava超入門 萌えJava超入門
定数になるのは
覚えてるッス!
final 修飾子をメソッドに付与するとオーバーライドできないメソッドになります。
萌えJava超入門
final メソッドは
変更禁止のメソッドだ。

finalメソッドはオーバライドできない
 final 修飾子をメソッドに付与すると、
 サブクラスでオーバーライドできないメソッドになります。
private と違って使用することはできます。

final は、メソッドでも「変更できない」という意味で使われていますね。



2. finalメソッドのサンプルコード

サンプルコードです。 Animal_01クラスの printNameメソッドに、 final 修飾子を付与しました。
継承先でオーバライドできるか確認してみましょう。

//Animal_01fm.java
/*
 final修飾子を printNameメソッドに付与
*/
public class Animal_01fm{

      protected static String group = "生き物です。";
      protected String name;

      public Animal_01fm(){
          this("無名");
      }
      public Animal_01fm(String name){
          this.name = name;
      }
      public static void printGroup(){
          System.out.println(group);
      }
      public final void printName(){
          System.out.println(name + "だぞ! ガオー!");
      }
}

//Cat_01fm.java
//Animal_01fm の final をオーバーライドできません

public class Cat_01fm extends Animal_01fm{

    public Cat_01fm(String name){
        super(name);
    }
    @Override
    public void printName(){
        System.out.println(name + "だニャン!");
    }
}

//Driver_fm.java
public class Driver_fm{
    public static void main(String[] args){
        Cat_01fm cat01 = new Cat_01fm("ニャース");
        cat01.printName();
    }
}

ファイルを wsフォルダに保存して実行します。

コマンドライン
ws>cd ws
ws>javac -encoding UTF-8 Driver_fm.java
.\Cat_01fm.java:10:エラー:
  Cat_01fmのprintName()は
  Animal_01fmのprintName()をオーバーライドできません
  public void printName(){
              ^
  オーバーライドされたメソッドはfinalです
エラー1個


萌えJava超入門 萌えJava超入門
コンパイルエラーね。
メッセージ自体は
とてもわかりやすくて
いいわね。
萌えJava超入門
知ってさえいれば
OKだろ?


3. finalクラスは継承できない


finalクラスは継承できない
final 修飾子を付与したクラスは継承ができなくなます。

萌えJava超入門 萌えJava超入門
継承自体が
ダメなのね。
萌えJava超入門
そう。


4. finalクラスのサンプルコード

サンプルコードです。
Animal_01クラスに final 修飾子を付与しました。
継承できるか確認してみましょう。

//Animal_01fc.java
/*
 final修飾子をクラスに付与
*/
public final class Animal_01fc{

      protected static String group = "生き物です。";
      protected String name;

      public Animal_01fc(){
          this("無名");
      }
      public Animal_01fc(String name){
          this.name = name;
      }
      public static void printGroup(){
          System.out.println(group);
      }
      public void printName(){
          System.out.println(name + "だぞ! ガオー!");
      }
}

//Cat_01fc.java
 //final の Animal_01fc を継承できません

public class Cat_01fc extends Animal_01fc{
    public Cat_01fc(String name){
        super(name);
    }
}

//Driver_fc.java
public class Driver_fc{
    public static void main(String[] args){
        Cat_01fc cat01 = new Cat_01fc("ニャース");
    }
}

ファイルを wsフォルダに保存して実行します。

コマンドライン
ws>cd ws
ws>javac -encoding UTF-8 Driver_fc.java
.\Cat_01fc.java:4:
  エラー: final Animal_01fcからは継承できません
public class Cat_01fc extends Animal_01fc{
                              ^
エラー1個


萌えJava超入門 萌えJava超入門
こっちも
コンパイルエラーね。
萌えJava超入門
問題なかろう?



お疲れ様でした。




© 2019 awasekagami