だいぶ前、ギターヒーローのイングヴェイが大物バンドのEuropeに対し、finalcountdownがほんとにfinalだったみたいなことを言っていたのを思い出した。
お品書き
- finalキーワードって?
- finalSample
◆finalキーワードって?
クラス、メンバー変数、メソッドにつけられる修飾子で
これで最後
の意味
クラス:継承が出来なくなる
メンバー変数:代入ができなくなる
➡定数は作れる
※定数名はすべて大文字(慣習)
メソッド:オーバーライドできなくなる
クラス
final class Student{
➡ class DameStudent extends Student
//コンパイル時点でエラー
//プログラム全体で見た時にこのプログラムを継承されてしまうと整合性が合わなくなってしまうというときにつける。
ちなみに、Integer.parseInt()メソッドはIntegerクラスは勝手に継承されては困るということで、finalクラスとして定義されています。
メンバー変数
final int BASE_NO = 1000;
➡BASE_NO = 2000; //finalで初期化しているため代入不可
プログラムの中で決まった値や変更しない値を取っておくために定数を使う。
メソッド
final void buckup(){
➡サブクラスに再定義 //できなくなる
◆finalSample
java
public class Person4{
private String name;
public Person4(String name){
this.name = name;
}
public void display(){
System.out.println("名前:" + name);
}
}
java
public final class Student4 extends Person4{
private int stuNo;
public Student4(String name, int stuNo){
super(name);
this.stuNo = stuNo;
}
public void display(){
super.display();
System.out.println("学籍番号:" + stuNo);
}
}
java
public class StuSample4{
public static void main(String[] args){
final int BASE_NO = 1000; //定数宣言
Student4 stu1 = new Student4("大輔",BASE_NO+1);
stu1.display();
Student4 stu2 = new Student4("湊丞",BASE_NO+2);
stu2.display();
}
}
cmd
C:\Java\1>java StuSample4
名前:大輔
学籍番号:1001
名前:湊丞
学籍番号:1002
Student4クラスはfinalキーワードを使っているため、別のクラスでStudent4クラスは継承できない状態。
java
public class DameStudent extends Student4{ //finalのStudent4クラスを継承
DameStudent(String name, int stuNo){
super(name, stuNo);
}
}
試しにコンパイルと実行↓
cmd
C:\Java\1>javac DameStudent.java
DameStudent.java:1: エラー: final Student4からは継承できません
public class DameStudent extends Student4{
^
エラー1個
となる。
定数を後で違う値を代入しようとすると
java
public class StuSample4{
public static void main(String[] args){
final int BASE_NO = 1000; //定数宣言
Student4 stu1 = new Student4("大輔",BASE_NO+1);
stu1.display();
Student4 stu2 = new Student4("湊丞",BASE_NO+2);
stu2.display();
BASE_NO = 2000; //定数に値を代入
}
}
cmd
C:\Java\1>javac StuSample4.java
StuSample4.java:8: エラー: final変数BASE_NOに値を代入することはできません
BASE_NO = 2000;
^
エラー1個
無事に怒られました。
finalをつけた変数に値を入れられるのは
初期化のときだけ