親クラスを継承した子クラスで、親クラスのインスタンスメソッドをオーバライドする際、いくつかのルールがあると思うのですが、その中で「インスタンスメソッドをstaticメソッドに変更してはいけない」というルールがどうしても腑に落ちません。
まず、正しいオーバーライドの構文を書きます。
下記ソースコードでは、SuperClassクラスを継承したSubClassクラスがSuperClassクラスで宣言しているmethodメソッドをオーバーライドしています。
そして、mainメソッドでSubClassクラスのインスタンスを生成し、インスタンスのアドレス値をSuperClassクラス型に暗黙変換し、sup変数に代入しています。
そして、SuperClass型のインスタンスのアドレス値が指すインスタンスのmethodメソッドを呼び出すと、オーバーライドのルールより、子クラスのメソッドが呼び出されるため、出力結果としては、「子クラス」と出ます。
public class Sample{ public static void main(String[] args){ SuperClass sup=new SubClass(); sup.method(); } } class SuperClass{ public void method(){ System.out.println("親クラス"); } } class SubClass extends SuperClass{ public void method(){ System.out.println("子クラス"); } }
ここからが疑問なのですが、
下記のようなソースコードを書くとメソッドのオーバーライドをしてる部分でコンパイルエラーとなります。理由としてはオーバーライドするメソッドのstatic修飾子を変更しているからです。それは分かるのですが、なぜ、staticなメソッドに変更してはいけないのでしょうか?
確かにインスタンスメソッドをstaticメソッドに変更することに違和感があると直感的には分かるのですが、いまいちピンときません。
また、今回のメソッドに関しては非staticメンバ変数を参照していないので、インスタンスメソッドでも非staticメソッドでも、機能面に異常はないように思えます。
ここの部分を詳しく教えていただける方がいましたら、よろしくお願いします。
public class Sample{ public static void main(String[] args){ SuperClass sup=new SubClass(); sup.method(); } } class SuperClass{ public void method(){ System.out.println("親クラス"); } } class SubClass extends SuperClass{ public static void method(){ System.out.println("子クラス"); } }
回答6件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/31 11:53
2020/09/06 22:05