首页 / 知识
关于Java:为什么我不能在接口中声明静态方法?
2023-04-12 20:41:00

Why can't I declare static methods in an interface?主题说明了其中的大部分——静态方法不能在接口中声明这一事实的原因是什么?
上面的代码给出了以下错误(至少在Eclipse中):"接口方法itest.test()的非法修饰符;只允许使用public&abstract"。 这里有几个问题要讨论。第一个问题是声明一个静态方法而不定义它。这就是
和
第一个是不可能的,因为ESPO提到:您不知道哪个实现类是正确的定义。 Java可以允许后者;事实上,从Java 8开始,它可以! 在接口中不能使用静态方法的原因在于Java解析静态引用的方式。当尝试执行静态方法时,Java不会麻烦寻找类的实例。这是因为静态方法不依赖实例,因此可以直接从类文件执行。考虑到接口中的所有方法都是抽象的,虚拟机必须查找接口的特定实现,以便找到静态方法背后的代码,以便执行该方法。这就与静态方法解析的工作原理相矛盾,并将在语言中引入不一致性。 我举个例子回答你的问题。假设我们有一个带有静态方法add的数学类。您可以这样调用此方法:
如果Math是接口而不是类,则它不能有任何已定义的函数。因此,说一些类似数学的话。加(2,3)是没有意义的。 其原因在于Java不允许多重继承的设计原则。多重继承的问题可以通过以下示例来说明:
现在,如果调用c.x()会发生什么?将执行a.x()还是b.x()?每个具有多重继承的语言都必须解决这个问题。 接口允许Java中某种限制的多重继承。为了避免上述问题,不允许使用方法。如果我们研究接口和静态方法的相同问题:
同样的问题,如果调用c.x()会发生什么? 静态方法不是实例方法。没有实例上下文,因此从接口实现它没有什么意义。 现在Java8允许我们在接口中定义甚至静态的方法。
注意:如果我们不显式地使用关键字default/static使它们成为默认方法和静态方法resp,那么默认情况下,接口中的方法仍然是公共抽象的。 你的问题有一个非常好和简洁的答案。(我觉得这是一种非常直接的解释方式,我想从这里把它联系起来。) 在Java 8中,接口中的静态方法似乎可以得到支持,我的解决方案只是在内部类中定义它们。
同样的技术也可用于注释:
内部类应该始终以 接口用于多态性,它适用于对象,而不是类型。因此(如前所述),拥有一个静态接口成员是没有意义的。 Java 8已经改变了世界,你可以在界面中使用静态方法,但是它迫使你为它提供实现。
}
例如,Comparator有一个静态的naturalOrder()方法。 接口不能实现的要求也得到了放宽。接口现在可以声明"默认"方法实现,这与普通实现类似,但有一个例外:如果从接口继承默认实现,从超类继承普通实现,则超类的实现将始终优先。 因为静态方法不能被继承。所以把它放在接口中没用。接口基本上是所有订户都必须遵守的合同。在接口中放置静态方法将强制订阅服务器实现它。这与静态方法不能被继承的事实相矛盾。 修饰符非法组合:静态和抽象 如果一个类的成员被声明为静态的,那么它可以与限制在该类中的类名一起使用,而不创建对象。 如果某个类的成员声明为抽象的,则需要将该类声明为抽象的,并且需要在继承的类(子类)中提供该抽象成员的实现。 您需要为要更改静态方法行为的子类中的类的抽象成员提供一个实现,该静态方法的行为也被声明为抽象,该抽象仅限于基类,这是不正确的 也许一个代码示例会有所帮助,我将使用C,但您应该能够遵循。 假设我们有一个名为ipayable的接口
现在,我们有两个具体的类来实现这个接口:
现在,假设我们有各种帐户的集合,为此,我们将使用ipayable类型的通用列表
现在,我们要向所有这些账户支付50美元:
所以现在您看到了接口是如何非常有用的。 它们仅用于实例化对象。不在静态类上。 如果您将Pay设置为静态,则在通过iPayable的In AccountStopay循环时,将无法确定它是否应调用BusinessAccount或CustomerAccount上的Pay。 |
最新内容
相关内容
python声明变量类型
python声明变量类型,培训,代码,基础,变量,赋值,类型,字符串,语句,函数,上面,对于没有编程基础的读者,可以先不编写真正的Python程序,而是先打开python变量不需要声明吗
python变量不需要声明吗,培训,数字,变量,代码,合法,声明,类型,整数,字符串,布尔,Python中常见的数据类型有字符串,整形,列表,元组,字典等。在Pythpython怎么声明变量
python怎么声明变量,培训,通用,一致,数字,变量,声明,字符串,引号,方式,类型,python声明变量:1、变量声明声明变量的时候,直接使用例如a=1这样的python静态方法怎么使用self
python静态方法怎么使用self,培训,管理,不了,方法,静态,属性,实例,变量,对象,参数,python-静态方法,类方法,属性方法静态方法实际上与类(或者实python变量使用前需声明嘛
python变量使用前需声明嘛,培训,代码,基础,变量,赋值,字符串,类型,语句,函数,上面,Python使用等号(=)作为赋值运算符,例如a=20就是一条赋值语python如何声明函数
python如何声明函数,培训,函数,较大,合法,代码,画线,工具,定义,单词,参数,python函数的定义定义函数,也就是创建一个函数,可以理解为创建一个具python定义变量需要声明类型吗
python定义变量需要声明类型吗,培训,数字,变量,合法,代码,声明,类型,整数,布尔,字符串,在Python语言中,声明变量的同时需要为其赋值,毕竟不代表pythonpython的声明变量类型
pythonpython的声明变量类型,培训,数字,变量,名字,代码,概念,合法,声明,类型,整数,变量(variable)是Python语言中一个非常重要的概念。变量的python需要声明类型吗
python需要声明类型吗,数据,培训,代码,中心,类型,声明,语言,变量,内存空间,内存,python不用去声明变量的类型,是由于其“若类型”的语言特性决关于架构:不同逻辑层上的接口
关于架构:不同逻辑层上的接口,关于架构:不同逻辑层上的接口,业务逻辑,数据访问,应用程序,描述,Interfaces on different logic layers关于c#:扩展接口模式
关于c#:扩展接口模式,关于c#:扩展接口模式,扩展,接口,拆分,功能,Extension interface patterns.Net 3.5中的新扩展允许从接口中拆分功能如何在C#中创建树视图首选项对话框
如何在C#中创建树视图首选项对话框类型的接口?,如何在C#中创建树视图首选项对话框类型的接口?,对话框,应用程序,首选项,就像,How to crea