java 静态方法 继承_java-为什么继承类静态方法而不继承接口静态方法?

在Java8之前,接口中无法定义静态或默认方法,这导致了实现接口时的不便。Java8引入了默认方法和静态方法,解决了接口扩展的问题并允许接口提供实现。默认方法使得接口可以有代码实现,而静态方法则作为工具方法存在,不依赖于接口的实例。这种改变使得接口更加强大,同时也保持了向后兼容性。
摘要由CSDN通过智能技术生成

在Java 8之前,您无法在foo()中定义Y.foo()方法。此问题对此进行了大量讨论。 我将参考此答案(由用户@ JamesA.Rosen来确定),为什么Java设计人员最初可能不希望在Y中使用X方法:

这里有一些问题。 首先是 声明一个静态方法而不定义它。 这是区别 之间

public interface Foo {

public static int bar();

}

public interface Foo {

public static int bar() {

...

}

}

Java不允许任何一种,但可以允许第二种。 首先是 由于Espo提到的原因,这是不可能的:您不知道 实现类是正确的定义。

Java可以允许后者,只要它将Interfaces视为 一流的对象。 Ruby的模块,大约是 等效于Java的接口,允许完全:

module Foo

def self.bar

...

end

end

但是,自Java 8发行以来,您实际上可以在X内添加Y.foo()和foo()方法。

我将在这里大量引用此资源。 这是最初的问题:

Java的界面语言功能使您可以使用 抽象方法并在其中提供这些方法的实现 实现接口的类。 您需要实施 每种方法,当有很多方法要 实行。 此外,发布界面后,您将无法添加新 无需中断源代码和二进制文件的抽象方法 兼容性。

这是Java 8提供的解决方案Y.foo():

Java 8通过改进接口来解决这些问题 默认和静态方法。 默认方法是实例方法 在其方法头以默认值开头的接口中定义 关键词; 它还提供了代码体。 每个实现 interface继承接口的默认方法,并且可以覆盖 他们

对于Y.foo():

静态方法是与其中的类相关联的方法 它是定义的,而不是使用从该类创建的任何对象定义的。 该类的每个实例都共享该类的静态方法。 Java 8还允许在接口中定义静态方法的地方 可以辅助默认方法。

当您实现包含静态方法的接口时, 静态方法仍然是接口的一部分,而不是接口的一部分 实现类。 因此,您不能在方法前添加前缀 类名。 相反,必须在方法的前面加上接口 名称

例:

interface X

{

static void foo()

{

System.out.println("foo");

}

}

class Y implements X

{

}

public class Z

{

public static void main(String[] args)

{

X.foo();

// Y.foo(); // won't compile

}

}

表达式Y.foo()将不会编译,因为foo()是静态成员 接口X的名称,而不是类Y的静态成员。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值