uniiiiiiiiii
@uniiiiiiiiii (UNI KAWANO)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

staticメソッドの継承関係での再定義とその呼び出しについて

解決したいこと

今年からJavaを学び始めた者です。
JavaSilver向けの問題集を解いている際に疑問に思った事があります。
問題集に以下のようなコードが出てきました。
この問題として出題されたコードの結果がなぜ以下に記載したようになるのかがわかりません。
試験で点を取るだけであればそういうものだと理解してスルーすればよいと思うのですが、どうにも引っかかってしまいまして...
どなたか、お教えいただけると幸いです。

問題

class A {
    static void method(){
        System.out.println("A");
    }
}

class B extends A {
    static void method(){
        System.out.println("B");
    }
}
public class Main{
    public static void main(String[] args){
        A obj = new B();
        obj.method();
    }
}

出力結果

A

参考書の解説

参考書の解説ですと、
「スーパークラスで定義したstatic変数、インスタンス変数、staticメソッド、インスタンスメソッドをサブクラス側で再定義することは可能ですが、サブクラスオブジェクトをスーパークラス型の変数に代入している場合、インスタンスメソッド以外はスーパークラスが呼び出される」
とのことで、処理の動きの解説があるだけで、なぜこのような処理になるのかの解説はありませんでした。

自分で思っていた処理

クラスAとクラスBのメソッドがstaticメソッドでない場合と同様の動きをして、結果として「B」を出力するのかなぁと思いつつ問題を解いていました。

0

2Answer

staticメソッドはクラスに紐づいたメソッド。クラスメソッドとも言います。
A obj = new B()obj は代入された変数の型によってクラスAに紐づいたオブジェクトとして認識されるので、クラスAのstaticメソッドが呼び出されます。
((B)obj).method(); とキャストするとクラスBのメソッドが呼び出されます。

C++やC#だと、定義次第ですがインスタンスメソッドもクラスAのを呼び出すことがあってびっくりします。

3Like

Comments

  1. @uniiiiiiiiii

    Questioner

    クラスメソッドというものなのですね。勉強になりました。ありがとうございます!

javaでは、static メソッドは、実行時でなくコンパイル時に解決されるからです。

2Like

Your answer might help someone💌