JavaSilverでメモしたところ備忘録として残しておこうと思います。
オーバーライド
- クラスを継承する際にスパークラスのメソッドをサブクラスで定義しなおすこと
- オーバーライドする際はシグニチャ(メソッド名・メソッドの引数の数・引数の順番)は同じにする必要がある
使用するメリット
- スーパークラスのメソッドを再利用することができ、記述量が減ること。変更がある際にも変更点が少なくなる
オーバーライドとの違い
- オーバーロードは同じメソッド名で、引数の数・引数の順番が違うメソッドを定義すること
super句
- super句を使うことでスパークラスのメソッドを使うことも可能
// スーパークラス
class SuperClass {
int num1;
int num2;
public SuperClass(int num1, int num2){
this.num1 = num1;
this.num2 = num2;
}
public void method(){
System.out.println("num1 + num2 = " + (num1 + num2));
}
}
// サブクラス
class SubClass extends SuperClass{
public ClassSub(int num1, int num2) {
super(num1, num2);//SuperClassのコンストラクタを呼び出す
}
@Override
public void method(){// SuperClassのmethod()をオーバーライドし処理を変更
System.out.println("num1 * num2 = " + (num1 * num2));
super.method(); // スーパークラスと同じ処理
}
}
public class Main {
public static void main(String[] args) {
SubClass s = new SubClass(3, 5);//SubClassのコンストラクタを呼び出す
s.method();
}
}
Override (アノテーション)
- アノテーションはオーバーライドを宣言するときに使用する
- 記述しなくてもいいが記述した際はメソッドがオーバーライドしていないとコンパイルエラーが発生する
オーバーライドできない
- staticメソッド
- final修飾子が付与されているメソッド
- throwsはスーパーメソッドのthrowsで指定した例外クラス以外
サブクラスは除外
スーパークラスのメソッドにthrowsがあっても、サブクラス側でthrowsを記述しないことは可能
privateなメソッドのオーバーライド
サブクラス側からprivateなメソッドは参照できないようになっているので単に別のメソッドとして解釈してコンパイルエラーも起こらない