为什么不能覆盖静态方法?
如果可能,请举例说明.
这是一个例子:
public interface IXMLizable<T>
{
static T newInstanceFromXML(Element e);
Element toXMLElement();
}
Run Code Online (Sandbox Code Playgroud)
当然这不会奏效.但为什么不呢?
其中一个可能的问题是,当您致电时会发生什么:
IXMLizable.newInstanceFromXML(e);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我认为它应该只调用一个空方法(即{}).所有子类都将被强制实现静态方法,因此在调用静态方法时它们都会很好.那么为什么这不可能呢?
编辑:我想我正在寻找比"因为这就是Java的方式"更深层次的答案.
是否有一个特殊的技术原因导致静态方法无法被覆盖?也就是说,为什么Java的设计者决定使实例方法可覆盖但不是静态方法?
编辑:我的设计的问题是我正在尝试使用接口来强制执行编码约定.
也就是说,界面的目标是双重的:
我希望IXMLizable接口允许我将实现它的类转换为XML元素(使用多态,工作正常).
如果有人想要创建一个实现IXMLizable接口的类的新实例,他们将始终知道将有一个newInstanceFromXML(Element e)静态构造函数.
除了在界面中添加评论之外,还有其他方法可以确保这一点吗?
编辑: 从Java 8开始,接口中现在允许使用静态方法.
在我的一次访谈中,我被要求解释Interface和Abstract类之间的区别.
这是我的回答:
Java接口的方法是隐式抽象的,不能有实现.Java抽象类可以具有实现默认行为的实例方法.
在Java接口中声明的变量默认为final.抽象类可能包含非最终变量.
默认情况下,Java接口的成员是公共的.Java抽象类可以具有类似私有,受保护等类通常的类成员.
应使用关键字"implements"实现Java接口; 应使用关键字"extends"扩展Java抽象类.
接口只能扩展另一个Java接口,抽象类可以扩展另一个Java类并实现多个Java接口.
Java类可以实现多个接口,但它只能扩展一个抽象类.
然而,面试官并不满意,并告诉我这个描述代表了" 书本知识 ".
他告诉我一个更实际的回答,解释我何时会使用实际例子在界面上选择一个抽象类.
我哪里做错了?
我最近一直与提供商合作,我遇到了一个有趣的情况,我希望有一个抽象的静态方法.我读了一些关于这个主题的帖子,这有点意义,但有一个很清楚的解释吗?
该主题大部分都说明了 - 静态方法无法在接口中声明的原因是什么?
public interface ITest {
public static String test();
}
Run Code Online (Sandbox Code Playgroud)
上面的代码给出了以下错误(至少在Eclipse中):"接口方法ITest.test()的非法修饰符;只允许使用public和abstract".
我使用过几种不同的语言,如Java,C#和Objective-C.
在大多数语言中,不需要对象实例的方法称为静态方法.然而,当谈到Objective-C时,有些人在你称之为静态方法时会变得防守,并且他们希望你将它们称为类方法.
为什么他们称为类方法而不是静态方法?静态方法和类方法有什么区别?
我知道界面必须是公开的.但是,我不希望这样.
我希望我的实现方法只能从他们自己的包中访问,所以我希望我的实现方法受到保护.
问题是我无法使接口或实现的方法受到保护.
什么是解决方法?是否存在与此问题相关的设计模式?
从Java指南中,抽象类也不能完成这项工作.
理论上我理解Java中没有抽象静态的原因,例如为什么静态方法在Java中不是抽象的.
但是我如何解决这样的问题呢?
我的应用程序使用几种类型的文件,我想分配静态属性,如该文件类型的描述(如"数据文件",另一种是"配置文件"等).显然,我会把它放到一个静态字符串中,以便在不实例化文件的情况下访问描述(对GUI文件很有用).另一方面,显然所有文件类型都应该有一些常见的方法getStatus(),显然我想从一个共同的超类继承MyFileType.
getDescription() 当然在超类中是抽象的.
尝试使用超类和接口的组合,但类似的问题:不允许静态实现抽象方法.
Java大师将如何解决这个问题?我想创建它真的是一个糟糕的实现吗?
非常感谢,Philipp
我知道,由于模糊性问题,抽象类和接口都不能包含抽象和静态的方法,但有没有解决方法?
我希望有一个抽象类或一个接口,它要求在所有扩展/实现此类/接口的类中包含静态方法.有没有办法在Java中这样做?如果没有,这可能是我与Java的最后一根稻草......
编辑1:这个问题的背景是我有一堆类,现在称它们为Stick,Ball和Toy,它们在数据库中有一堆条目.我想创建一个名为Fetchable的超类/接口,它需要getFetchables()在它下面的每个类中使用静态方法.Stick,Ball和Toy中的方法必须是静态的原因是因为它们将与数据库通信以检索数据库中每个类的所有条目.
编辑2:对于那些说你不能用任何语言做到这一点的人,那是不正确的.你当然可以在Ruby中继承类方法.这不是某人没有获得OO的情况,这是Java语言中缺少功能的情况.您可以尝试争辩说您永远不需要继承静态(类)方法,但这是完全错误的,我将忽略任何提出这些要点的答案.
作为一个免责声明,我读过为什么静态方法不能在Java中抽象化,即使我恭敬地不同意关于"逻辑矛盾"的公认答案,我也不希望任何答案static abstract只是答案的用处我的问题;)
我有一个类层次结构,表示数据库中的一些表.每个类都继承了一个类,Entity该类包含许多用于访问数据库,创建查询,转义字符等的实用方法.
类的每个实例都是数据库中的一行.
现在,为了尽可能多地分解代码,我想添加有关每个类的相关列和表名的信息.这些信息必须在没有类实例的情况下可访问,并将用于Entity构建查询等.
存储这些数据的显而易见的方法是每个类中的静态方法返回的静态字段.问题是你不能强制类实现这些静态方法,你不能在Java中调用静态方法调用动态链接.
HashMap或任何类似的数据结构来保存信息.问题:如果缺少信息,则错误将在运行时而不是编译时.你将如何应对abstract static抽象方法的缺失和动态链接?
在完美的世界中,如果缺少类的信息并且可以通过使用Entity类轻松访问数据,则给定的解决方案应该生成编译错误.
答案不需要在Java中,C#也可以,如果没有任何语言的特定代码,如何做到这一点的任何见解将受到欢迎.
需要明确的是,除了简单之外,我没有任何要求.没有什么必须是静态的.我只想从中检索表和列名Entity来构建查询.
class Entity {
public static function afunction(Class clazz) { // this parameter is an option
// here I need to have access to table name of any children of Entity
}
}
class A extends Entity {
static String table = "a";
}
class B extends Entity { …Run Code Online (Sandbox Code Playgroud) java ×8
interface ×5
static ×4
inheritance ×2
oop ×2
.net ×1
abstract ×1
c# ×1
class-method ×1
methods ×1
objective-c ×1
overriding ×1
terminology ×1