2

これは私のスーパークラスです:

class Superclass {

       int a=89;

       final  static void m( int p){
            System.out.println("Inside superclass");
       }   

       static void n(){
            system.out.print("superclass");
       }

}

これは私のサブクラスです::

 class Subclass extends Superclass {

        int a=90;

        static  void m( int p){
             System.out.println("Inside subclass");
        }

        static void n(){
             system.out.print("subclass");  
        }
  }

メインクラス:

   class main {
        public  static void main(String[] args) {
            Subclass.m(89);
           new Subclass().n();
        }
   }

問題は、Javac が静的メソッドでオーバーライド エラーを表示している理由を理解できないことです.PS plzz は、オーバーライドのすべてのルールが非表示にも有効であることを詳しく説明しています。お気に入り

新しいメソッド定義には、同じメソッド シグネチャ (つまり、メソッド名とパラメーター) と同じ戻り値の型が必要です。オーバーライド メソッドのパラメーターを final にするかどうかは、サブクラス メソッドのシグネチャの裁量に委ねられており、パラメーターの final 修飾子は含まれず、型と順序のみが含まれます。

新しい

メソッド定義はメソッドのアクセシビリティを狭めることはできませんが、広げることはできます。新しいメソッド定義は、スーパークラスのオーバーライドされたメソッドの throws 句で指定された例外クラスのすべてまたはまったく指定しないか、または例外クラスのサブセット (サブクラスを含む) のみを指定できます。

私のエラーは次のとおりです: 実行:

スレッド「メイン」での例外 java.lang.RuntimeException: コンパイルできないソース コード - javaapplication3.Subclass の m(int) は javaapplication3.Superclass の m(int) をオーバーライドできません:18) javaapplication3.min.main(JavaApplication3.java:25) で Java 結果: 1

また、メソッドがスーパークラスを拡張するサブクラスによって隠されているときにメソッドのどのバージョンが実行されるかを解決するためにクラス名から呼び出された静的メンバーかどうかを尋ねたいと思います。 . メインクラスの上記のコードで、次のように入力します: new Subclass().n();

コンパイラは、参照変数の型を提供していない場合でも、メソッドのサブクラス バージョンを呼び出す必要があることをどのように認識しますか?

4

2 に答える 2

5

JLS 8.4.3.3から:

サブクラスがメソッドをオーバーライドまたは非表示にしないように、メソッドを final として宣言できます。

親クラスの同じシグネチャを持つ静的メソッドは、サブクラスのインスタンスから呼び出されると非表示になります。ただし、最終メソッドをオーバーライド/非表示にすることはできません。このキーワードfinalは、メソッドの非表示を無効にします。したがって、それらを非表示にすることはできず、非表示にしようとするとコンパイラ エラーが発生します。Javaranchには、これに関する素晴らしい説明があります。

于 2013-07-07T11:23:07.883 に答える
2

ここで観察しているのは、次のように述べているJLS 8.4.3.3に従っています。

final メソッドをオーバーライドまたは非表示にしようとすると、コンパイル時エラーになります。

final static void mサブクラス のメソッドをオーバーライドしようとしていますが、これは Java コンパイラで許可されていません。

于 2013-07-07T11:29:34.440 に答える