Java-オーバーライド
前の章では、スーパークラスとサブクラスについて話しました。クラスがそのスーパークラスからメソッドを継承する場合、メソッドが final とマークされていなければ、メソッドをオーバーライドする可能性があります。
オーバーライドの利点は、サブクラスの型に固有の動作を定義できることです。これは、サブクラスがその要件に基づいて親クラスのメソッドを実装できることを意味します。
オブジェクト指向の用語では、オーバーライドは既存のメソッドの機能をオーバーライドすることを意味します。
例
例を見てみましょう。
ライブデモ
class Animal {
public void move() {
System.out.println("Animals can move");
}
}
class Dog extends Animal {
public void move() {
System.out.println("Dogs can walk and run");
}
}
public class TestDog {
public static void main(String args[]) {
Animal a = new Animal(); // Animal reference and object
Animal b = new Dog(); // Animal reference but Dog object
a.move(); // runs the method in Animal class
b.move(); // runs the method in Dog class
}
}
これにより、次の結果が生成されます-
出力
Animals can move Dogs can walk and run
上記の例では、b Animal の一種で、Dog クラスの move メソッドを実行します。その理由は次のとおりです。コンパイル時に、参照型でチェックが行われます。ただし、実行時に、JVM はオブジェクト タイプを判断し、その特定のオブジェクトに属するメソッドを実行します。
したがって、上記の例では、Animal クラスにメソッド move があるため、プログラムは正しくコンパイルされます。次に、実行時に、そのオブジェクトに固有のメソッドを実行します。
次の例を検討してください-
例
ライブデモ
class Animal {
public void move() {
System.out.println("Animals can move");
}
}
class Dog extends Animal {
public void move() {
System.out.println("Dogs can walk and run");
}
public void bark() {
System.out.println("Dogs can bark");
}
}
public class TestDog {
public static void main(String args[]) {
Animal a = new Animal(); // Animal reference and object
Animal b = new Dog(); // Animal reference but Dog object
a.move(); // runs the method in Animal class
b.move(); // runs the method in Dog class
b.bark();
}
}
これにより、次の結果が生成されます-
出力
TestDog.java:26: error: cannot find symbol
b.bark();
^
symbol: method bark()
location: variable b of type Animal
1 error
b の参照型 Animal には bark という名前のメソッドがないため、このプログラムはコンパイル時エラーをスローします。
メソッドオーバーライドのルール
- <リ>
引数リストは、オーバーライドされたメソッドのものとまったく同じでなければなりません。
<リ>戻り値の型は、スーパークラスの元のオーバーライドされたメソッドで宣言された戻り値の型と同じか、そのサブタイプである必要があります。
<リ>アクセス レベルは、オーバーライドされたメソッドのアクセス レベルより厳しくすることはできません。例:スーパークラス メソッドが public と宣言されている場合、サブクラスのオーバーライド メソッドを private または protected にすることはできません。
<リ>インスタンス メソッドは、サブクラスによって継承されている場合にのみオーバーライドできます。
<リ>final と宣言されたメソッドはオーバーライドできません。
<リ>static として宣言されたメソッドはオーバーライドできませんが、再宣言することはできます。
<リ>メソッドを継承できない場合は、オーバーライドできません。
<リ>インスタンスのスーパークラスと同じパッケージ内のサブクラスは、private または final と宣言されていないスーパークラス メソッドをオーバーライドできます。
<リ>別のパッケージのサブクラスは、パブリックまたはプロテクトとして宣言された非最終メソッドのみをオーバーライドできます。
<リ>オーバーライドされたメソッドは、オーバーライドされたメソッドが例外をスローするかどうかに関係なく、未チェックの例外をスローできます。ただし、オーバーライドするメソッドは、オーバーライドされたメソッドによって宣言されたものよりも新しい、またはより広いチェック例外をスローするべきではありません。オーバーライド メソッドは、オーバーライドされたメソッドよりも狭い範囲または少ない例外をスローできます。
<リ>コンストラクターはオーバーライドできません。
super キーワードの使用
オーバーライドされたメソッドのスーパークラス バージョンを呼び出すと、スーパー キーワードが使用されています。
例
ライブデモ
class Animal {
public void move() {
System.out.println("Animals can move");
}
}
class Dog extends Animal {
public void move() {
super.move(); // invokes the super class method
System.out.println("Dogs can walk and run");
}
}
public class TestDog {
public static void main(String args[]) {
Animal b = new Dog(); // Animal reference but Dog object
b.move(); // runs the method in Dog class
}
}
これにより、次の結果が生成されます-
出力
Animals can move Dogs can walk and run
Java
- Java オペレーター
- Java インターフェイス
- Java try-with-resources
- Java の String Length() メソッド:例で見つける方法
- 部分文字列と例を含む Java String indexOf() メソッド
- Java String charAt() メソッドと例
- Java String compareTo() メソッド:例での使用方法
- Java String contains() メソッド |部分文字列を例でチェック
- 例を使用したJava文字列のendsWith()メソッド
- Java 文字列 replace()、replaceAll() および replaceFirst() メソッド
- Javaの静的変数:静的ブロック&メソッドとは【例】