Java 为什么我得到的方法覆盖错误?

Java 为什么我得到的方法覆盖错误?,java,compiler-errors,method-hiding,Java,Compiler Errors,Method Hiding,这是我的超类: class Superclass { int a=89; final static void m( int p){ System.out.println("Inside superclass"); } static void n(){ system.out.print("superclass"); } } 这是我的子类:: class Subc

这是我的超类:

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在静态方法中给了我覆盖错误。一个p.S plzz详细说明了所有覆盖规则对于隐藏也是有效的。像

新方法定义必须具有相同的方法签名(即。, 方法名称和参数)和相同的返回类型。是否 重写方法中的参数在 子类方法签名的自由裁量权不包括 参数的最终修饰符,仅限于其类型和顺序

新的

方法定义不能缩小方法的可访问性,但 新方法定义只能指定全部或全部 无,或异常类的子集(包括其 子类)中重写的方法的throws子句中指定 超类

我的错误是: 运行:

线程“main”java.lang.RuntimeException中的异常:不可编译 源代码-javaapplication3中的m(int)。子类不能重写 javaapplication3中的m(int)。超类重写方法为 静态,最终版本为javaapplication3.Subclass.m(javaapplication3.java:18) 在javaapplication3.min.main(javaapplication3.java:25)中,java结果:1

我还想问,当扩展超类的子类隐藏方法时,是否从classname调用静态成员来解析执行方法的哪个版本 如果我创建匿名对象,然后调用方法,那么编译器如何确定应该调用哪个版本的方法呢。 在上面主类i中的代码中,键入以下内容:新的子类().n()

即使我没有提供引用变量的类型,编译器如何知道应该调用方法的子类版本

方法可以声明为final,以防止子类重写或隐藏它

当从子类的实例调用具有相同父类签名的静态方法时。但是,您不能覆盖/隐藏。
关键字
final
将禁止隐藏该方法。因此它们不能被隐藏,尝试这样做将导致编译器错误。关于这一点,有一个很好的解释。

你在这里观察到的情况与以下陈述一致:

试图覆盖或隐藏最终版本是编译时错误 方法。


您试图重写子类中的
final static void m
方法,这是Java编译器不允许的。

您不能重写final方法。Final声明不重写方法。@bzzzrd是正确的,您认为如何重写Final/sealed成员?这没有道理!!他试图超越或隐藏?@JaimeHablutzel他试图超越。这个概念存在吗?我认为静态方法不能仅仅隐藏就被覆盖。@JaimeHablutzel是的,你是对的。它藏起来了。我的缺点是,我把这个概念称为过度隐藏……)