【问题标题】:Static Methods Working静态方法工作
【发布时间】:2015-07-10 08:13:26
【问题描述】:

变得很困惑...我读到静态方法不会覆盖,但在下面的程序中它不遵循该规则...谁能详细解释一下。这是程序
程序的输出是A 类方法输出。

public class JavaApplication6 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
       A a=new B();
       a.r();
    }

}
class B extends A{
    static int d=200;
    static void r(){
        System.out.println("hiiiiiiiiiiiiiiiii r"+d);
    }
}
class A {
   static int a=10,c=20;
  static void r(){
        System.out.println("hiiii ar"+a);
    }
}

【问题讨论】:

  • 如果输出来自 A 的方法,那么它不会被覆盖。
  • 在我的笔记本电脑上,您的程序生成了“hiiii ar10”,这意味着 A.r() 可以工作。所以结果确实表明静态方法没有发生覆盖。
  • 关键字extend 表示继承,而不是覆盖。此外 - 这两个类不是static - 它们有static 方法,但类本身不是静态的。
  • 如果你添加@Override,那么问题可能会出现

标签: java


【解决方案1】:

静态方法不能被覆盖,但可以隐藏父静态方法

这里有一个简洁的例子。

这是解释覆盖实例方法和隐藏类(静态)方法之间区别的 java 文档。

覆盖:Java 中的覆盖仅仅意味着特定的方法 将根据对象的运行时类型而不是在 它的编译时类型(这是覆盖静态的情况 方法)

隐藏:静态的父类方法不是子类的一部分 类(尽管它们是可访问的),所以没有问题 覆盖它。即使您在子类中添加另一个静态方法, 与其父类中的相同,这个子类的静态方法 是唯一的,不同于其父类中的静态方法。

更多详情click here 希望对你有帮助。

【讨论】:

    【解决方案2】:

    静态方法不能被覆盖,您提供的代码是方法隐藏的示例。在上面的例子中,你的 B 类的方法是使用静态键隐藏的。

    【讨论】:

      【解决方案3】:

      静态方法永远不会被子类覆盖。如果您放置 @Override 注释,它将给出一个编译错误,您无法覆盖它,告诉您删除注释。

      “Child类型的方法method1()必须重写或实现超类型方法”

      它被继承给子类。

      【讨论】:

        猜你喜欢
        • 2016-08-07
        • 2018-10-22
        • 1970-01-01
        • 1970-01-01
        • 2012-07-26
        • 1970-01-01
        • 1970-01-01
        • 2011-05-04
        相关资源
        最近更新 更多