Java接口中的静态方法
我对我的密码有疑问。我了解到在JAVA中不能重写静态方法,但在这里它似乎工作得很好。 当我同时给出默认关键字和静态关键字时,如下所示Java接口中的静态方法,java,Java,我对我的密码有疑问。我了解到在JAVA中不能重写静态方法,但在这里它似乎工作得很好。 当我同时给出默认关键字和静态关键字时,如下所示 interface TestInterface { public static void square(int a) { System.out.println("Square is "+a*a); } public static void show() { System.out.pri
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将此视为错误的原因是什么?调用
静态
方法时不需要相关类/接口的实例。通常,它们是实用方法
default
方法意味着在相关接口的实例上调用。此接口的所有实现都将具有此方法定义,除非它被重写
这两个术语不能同时使用的原因很简单,因为它们相互矛盾:
default
需要一个对象,static
不需要对象。调用static
方法时不需要相关类/接口的实例。通常,它们是实用方法
default
方法意味着在相关接口的实例上调用。此接口的所有实现都将具有此方法定义,除非它被重写
这两个术语不能同时使用的原因很简单,因为它们相互矛盾:
default
需要对象,static
不需要对象。TestClass.show()
和TestClass.square()
不是静态的
,因此不要覆盖界面中的静态
方法。它们是成员方法,需要对象来调用它们。另一方面,接口中具有相同名称的方法是静态的,因此您可以使用接口名或类名调用它们,而不使用对象。TestClass.show()
和TestClass.square()
不是静态的
,因此不要覆盖界面中的静态
方法。它们是成员方法,需要对象来调用它们。另一方面,接口中具有相同名称的方法是静态的
,因此您可以在没有对象的情况下使用接口名或类名调用它们。静态方法被隐藏而不是重写。感谢您的解释@代码学徒,你所说的“隐藏而非覆盖”是什么意思?编译器是否将静态和非静态方法视为两个完全不同的实体?即使它们具有相同的签名?下次尝试之前的研究内容。静态方法被隐藏而不是覆盖。谢谢您的解释@代码学徒,你所说的“隐藏而非覆盖”是什么意思?编译器是否将静态和非静态方法视为两个完全不同的实体?即使他们有相同的签名?下次尝试之前的研究。谢谢你的帮助。澄清我的疑问:)谢谢你的帮助。澄清了我的疑问:)谢谢你的帮助。它解决了我的疑问:)谢谢你的帮助。它解决了我的疑问:)
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");
}
}