【问题标题】:Static methods in Interfaces in Java [duplicate]Java接口中的静态方法[重复]
【发布时间】:2017-07-29 06:00:07
【问题描述】:
 interface TestInterface
 {
    public static void square(int a)
    {
        System.out.println("Square is "+a*a);
    }

    public static  void show()
    {
        System.out.println("Default Method Executed");
    }

 }
class TestClass implements TestInterface
{
    public void square(int a)
    {
        System.out.println(a*a);
    }

    public void show()
    {
        System.out.println("Overridden Method");
    }
    public static void main(String args[])
    {
        TestClass d=new TestClass();
        d.square(4);
        TestInterface.square(4);
        TestInterface.show();
        d.show();
    }
}

我对我的代码有疑问。我了解到静态方法不能在 JAVA 中被覆盖,但它似乎在这里工作正常。 当我同时给出默认和静态关键字时,像这样

interface TestInterface
   {
        default static void square(int a)
        {
            System.out.println("Square is "+a*a);
        }

        public static  void show()
        {
            System.out.println("Default Method Executed");
        }

    }

出现如下错误: 修饰符的非法组合:静态和默认

JAVA 将其视为错误的原因是什么?

【问题讨论】:

  • 静态方法被隐藏而不是被覆盖。
  • 感谢您的解释。 @Code-Apprentice,你所说的“阴影而不被覆盖”是什么意思?编译器是否将静态和非静态方法视为两个完全不同的实体?即使他们有相同的签名?
  • 下次试试之前的研究。

标签: java


【解决方案1】:

static 方法意味着在没有相关类/接口的实例的情况下调用。通常它们是实用方法。

default 方法旨在在相关接口的实例上调用。此接口的所有实现都将具有此方法定义,除非它被覆盖。

这两个术语不允许一起使用的原因仅仅是因为它们相互矛盾:default 需要一个对象,static 不需要对象。

【讨论】:

  • 感谢您的帮助。澄清了我的疑问:)
【解决方案2】:

TestClass.show()TestClass.square() 不是 static,因此不要覆盖接口中的 static 方法。它们是成员方法,需要一个对象来调用它们。另一方面,接口中同名的方法是static,所以你可以用接口名或类名来调用它们,而不需要对象。

【讨论】:

  • 感谢您的帮助。它解决了我的疑惑:)
猜你喜欢
  • 2018-07-10
  • 2018-01-11
  • 2014-06-02
  • 2018-09-24
  • 2017-12-04
  • 2010-12-16
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多