scjp試験準備-8-finalキーワード

2984 ワード

タイトルは、次のコードの実行結果です.
import java.util.ArrayList;



class Pizza{

    ArrayList toppings;

    

    public final void addTopping(String topping){

        toppings.add(topping);

    }

    

    public void removeTopping(String topping){

        toppings.remove(topping);

    }

}



class PepperoniPizza extends Pizza{



    public void addTopping(String topping){

        System.out.println("Cannot add Toppings");

    }

    

    public void removeTopping(String topping){

        System.out.println("Cannot remove pepperoni");

    }

}



public class Test{



    public static void main(String[] args){

        Pizza pizza = new PepperoniPizza();

        pizza.addTopping("Mushrooms");

        pizza.removeTopping("Pepperoni");

    }

    

}

 
この問題はやはり関連知識の継承と書き換えを考察している.しかし、ここではfinalキーワードについて説明します.
finalキーワードに関する知識点を調べてみました.
1.final修飾のメンバー変数は、初期値を明示的に指定する必要があります.
2.final修飾クラスメンバー変数は、変数が宣言されたときまたは静的初期化ブロックに初期値を指定する必要があります.
3.final修飾のインスタンスメンバー変数は、変数を宣言するとき、または非静的初期化ブロックまたはコンストラクタで初期値を指定する必要があります.
4.final修飾のメンバー変数は、初期値が付与されると再付与できない.
5.final修飾のメンバー変数は、初期値が指定される前(初期化される前)にアクセスできません.
6.final修飾のローカル変数.システムはローカル変数を初期化しないため、ローカル変数は明示的に初期化する必要があります.したがってfinalを使用してローカル変数を修飾する場合は、定義時に初期値を指定してもよいし、初期値を指定しなくてもよい.同様にfinal修飾の局所変数は,初期値が指定されると再付与されてはならない.ここで注目すべきはfinal修飾の形参であり、final修飾の形参が存在する方法では、final修飾の形参は付与できない.
7.final修飾の参照タイプ変数.参照タイプ変数は1つの参照アドレスのみを保存し、finalを使用して変数が保存したアドレスが変動しないことを保証することができるが、アドレスに保存されたオブジェクトは変化することができる.
8.finalメソッドは書き換えられません.子クラスが親クラスのメソッドを書き換えたくない場合は、final修飾というメソッドを使用します.
9.final修飾のクラスにはサブクラスがあってはならない.クラスが継承されないことを保証するためにfinalを使用してクラスを修飾することができます.
 
問題のPizzaクラスのaddToppingメソッドは書き換えられません.書き換えると異常が報告されます.