staticメソッドはクラスに紐づいたメソッド。クラスメソッドとも言います。
A obj = new B()
で obj
は代入された変数の型によってクラスA
に紐づいたオブジェクトとして認識されるので、クラスA
のstaticメソッドが呼び出されます。
((B)obj).method();
とキャストするとクラスB
のメソッドが呼び出されます。
C++やC#だと、定義次第ですがインスタンスメソッドもクラスAのを呼び出すことがあってびっくりします。
Like!
今年から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」を出力するのかなぁと思いつつ問題を解いていました。
staticメソッドはクラスに紐づいたメソッド。クラスメソッドとも言います。
A obj = new B()
で obj
は代入された変数の型によってクラスA
に紐づいたオブジェクトとして認識されるので、クラスA
のstaticメソッドが呼び出されます。
((B)obj).method();
とキャストするとクラスB
のメソッドが呼び出されます。
C++やC#だと、定義次第ですがインスタンスメソッドもクラスAのを呼び出すことがあってびっくりします。
@uniiiiiiiiii
Questionerjavaでは、static メソッドは、実行時でなくコンパイル時に解決されるからです。