0

派生クラスと派生クラスでメソッドを静的として宣言し、アップキャストを行うときに、ベースクラスメソッドを呼び出す理由。

class Base
{
    static void show(){
        System.out.println("Base class....");
    }
}
class Derive extends Base
{
    static void show(){
        System.out.println("Drive class....");
    }//method hidding.....

    public static void main(String[] args) 
    {
        Base b= new Derive();
            b.show();           
    }
}
4

3 に答える 3

6

ここで言及すべきいくつかの問題があります:

  • 静的メソッドは継承されず、サブクラスによってオーバーライドされません
  • 静的メソッドは、呼び出されるインスタンスを必要とせず、クラスが必要です

つまり、基本的に、呼び出すとb.show();は実際に呼び出すことを意味しますBase.show();

于 2012-08-25T19:21:55.893 に答える
2

あなたが呼んBase.showでいるのは、ではありませんDerive.show。メソッドの非表示はオーバーライドされません。

§8.4.8.2。Java言語仕様のは、ここで何が起こるかを正確に示す例を示しています。

非表示のクラス(static)メソッドは、メソッドの宣言を実際に含むクラスを型とする参照を使用して呼び出すことができます。この点で、staticメソッドの非表示はインスタンスメソッドのオーバーライドとは異なります。例:

class Super {
    static String greeting() { return "Goodnight"; }
    String name() { return "Richard"; }
}
class Sub extends Super {
    static String greeting() { return "Hello"; }
    String name() { return "Dick"; }
}
class Test {
    public static void main(String[] args) {
        Super s = new Sub();
        System.out.println(s.greeting() + ", " + s.name());
    }
}

出力を生成します:

Goodnight, Dick

グリーティングの呼び出しは、コンパイル時にどのクラスメソッドを呼び出すかを把握するためにs、のタイプを使用しますが、の呼び出しは、実行時にどのインスタンスメソッドを呼び出すかを把握するために、のクラスを使用するためです。呼び出す。SupernamesSub

于 2012-08-25T19:24:06.963 に答える
1

上記の回答をもう1つ完了します。インスタンス変数ではなく、クラスごとにクラスメソッドを呼び出すことをお勧めします。メソッドが静的メソッドであることを明確にしBase.show() ないでください。b.show()これは、メソッドをオーバーライドするのではなく、非表示にする場合に特に役立ちます。

于 2012-08-25T19:39:55.067 に答える