当前位置: 首页 > 面试题库 >

为什么不能实现类将覆盖方法定义为静态方法?

皇甫雨石
2023-03-14
问题内容

我很困惑为什么不允许以下内容:

public interface MyInterface {
  MyInterface getInstance(String name);
}

public class MyImplementation implements MyInterface {
  public MyImplementation(String name) {
  }
  @Override
  public static MyInterface getInstance(String name) { // static is not allowed here
    return new MyImplementation(name)
  }
}

我知道为什么接口中的方法不能是静态的,但是为什么覆盖方法不能是静态的?

我希望所有类都可以实现该getInstance(String name)方法,但目前仅限于如果已经实例化了该对象而无法调用该方法,则只能调用该方法…

**_更新: _ 感谢您的回答,我现在对此有了更好的了解。基本上,我不应该尝试使实用程序类(或与此相关的工厂类)实现接口(或者至少不是这样)。


问题答案:

在Java中调用静态方法要求您指定确切的类型。无法多态调用静态方法,从而消除了对的需求@Override

请注意,这种方法并非在所有语言中都通用:例如,您可以在Objective-C中覆盖 类方法
,并且Apple的可可框架很好地利用了这种机制来自定义其“工厂”类。但是,在Java中,C ++和C#类方法不支持多态行为。

从理论上讲,static如果实现无需从实例访问状态,则Java设计人员可以让您通过方法提供接口方法实现。但是,使用简单的包装器就可以轻松实现相同的行为:

public class MyImplementation implements MyInterface {
    public MyImplementation(String name) {
    }
    @Override
    public MyInterface getInstance() { // static is not allowed here
        return getInstanceImpl();
    }
    public static getInstanceImpl() {
        return new MyImplementation(name)
    }
}

Java编译器可以代表您做同样的事情,但是看到静态方法实现实例方法既不寻常又令人困惑,因此我的猜测是Java设计人员决定不提供这种“魔力”。



 类似资料:
  • 问题内容: 为什么无法覆盖静态方法? 如果可能,请使用示例。 问题答案: 覆盖取决于拥有类的实例。多态性的重点是可以对一个类进行子类化,并且实现那些子类的对象对于在超类中定义的相同方法(在子类中被重写)将具有不同的行为。静态方法未与类的任何实例相关联,因此该概念不适用。 影响Java设计的因素有两个。一个是对性能的关注:Smalltalk批评它太慢(垃圾回收和多态调用是其中的一部分),Java的创

  • 我试图理解为什么我们不能覆盖静态和最终方法。我不明白背后的目的。

  • 问题内容: 我正在为某门课程的一些代码编写解释,并且偶然使用了这些单词并且可以互换使用。我决定回过头来修正措辞,但在我的理解上遇到了一个漏洞。 据我了解,子例程是一个如果它不作用于一个类的实例(其作用仅限于其显式输入/输出),并且是一个如果它作用于一个类的实例(它可能带有消除导致实例不纯的副作用)。 这里有一个很好的讨论主题。请注意,根据接受的答案的定义,静态实际上应该是一个函数,因为永远不会隐式

  • 问题内容: 当静态方法在子类中被重写时,我对它的行为感到困惑。 下面是代码: 为什么在第二种情况下在这里调用超类的静态方法? 如果方法不是静态的,则根据多态性,当在运行时传递子类对象时,将调用子类的方法。 问题答案: 静态方法的解析始终基于类型。 代码 编译后转换为此 对此,它是对方法的调用而不是对子类方法的调用。因此,您将获得方法的输出。

  • 问题内容: 编辑: 从Java 8开始,接口中现在允许使用静态方法。 例子如下: 当然这行不通。但是为什么不呢? 可能的问题之一是,当你致电时会发生什么: 在这种情况下,我认为它应该只调用一个空方法(即{})。所有子类都将被强制实现static方法,因此在调用static方法时它们都很好。那为什么不可能呢? 编辑:我想我正在寻找比“因为这就是Java的方式”更深的答案。 有特定的技术原因为什么不能

  • 伙计们,我有一个简单但令人讨厌的问题。据我所知,基本上意味着,对于该类的每个实例,这个方法将是相同的,如果我们改变它,这将改变该类的每个实例,它也被称为类方法。那么,如果我有一个类,它实现了某种格式的方法,让我们说: 为什么不能设置为静态?因为该类的每个实例的格式都是相同的。。。?