Javaでは、静的メソッドをオーバーライドすることはできません。その理由はここできちんと説明されています
したがって、参照されているオブジェクトには依存しません。しかし、代わりに、それは参照のタイプに依存します。したがって、静的メソッドは別の静的メソッドを非表示にし、それをオーバーライドしないと言われます。
例(猫は動物のサブクラスです):
public class Animal {
public static void hide() {
System.out.format("The hide method in Animal.%n");
}
public void override() {
System.out.format("The override method in Animal.%n");
}
}
public class Cat extends Animal {
public static void hide() {
System.out.format("The hide method in Cat.%n");
}
public void override() {
System.out.format("The override method in Cat.%n");
}
}
メインクラス:
public static void main(String[] args) {
Cat myCat = new Cat();
System.out.println("Create a Cat instance ...");
myCat.hide();
Cat.hide();
myCat.override();
Animal myAnimal = myCat;
System.out.println("\nCast the Cat instance to Animal...");
Animal.hide();
myAnimal.override();
Animal myAnimal1 = new Animal();
System.out.println("\nCreate an Animal instance....");
Animal.hide();
myAnimal.override();
}
これで、出力は次のようになります。
Create a Cat instance ...
The hide method in Cat.
The hide method in Cat.
The override method in Cat.
Cast the Cat instance to Animal...
The hide method in Animal.
The override method in Cat.
Create an Animal instance....
The hide method in Animal.
The override method in Animal.
の場合class methods
、ランタイムシステムは、メソッドが呼び出される参照のコンパイル時タイプで定義されたメソッドを呼び出します。
つまり、静的メソッドの呼び出しはコンパイル時にマップされ、実行時に参照が指すインスタンスではなく、宣言された参照の型(この場合は親)に依存します。この例では、のコンパイル時タイプはmyAnimal
ですAnimal
。したがって、ランタイムシステムはで定義されたhideメソッドを呼び出しますAnimal
。