这是一个例子:
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开始,接口中现在允许使用静态方法.
所以我想说我有这个界面:
public interface IBox
{
public void setSize(int size);
public int getSize();
public int getArea();
//...and so on
}
Run Code Online (Sandbox Code Playgroud)
我有一个实现它的类:
public class Rectangle implements IBox
{
private int size;
//Methods here
}
Run Code Online (Sandbox Code Playgroud)
如果我想使用IBox接口,我实际上无法创建它的实例,方式如下:
public static void main(String args[])
{
Ibox myBox=new Ibox();
}
Run Code Online (Sandbox Code Playgroud)
对?所以我实际上必须这样做:
public static void main(String args[])
{
Rectangle myBox=new Rectangle();
}
Run Code Online (Sandbox Code Playgroud)
如果这是真的,那么接口的唯一目的是确保实现接口的类如接口所描述的那样在其中获得了正确的方法?或者是否还有其他任何接口用途?
我对这件事情仍然有些困惑.我到现在所发现的是
(这里已经提出了类似的问题,但我还有其他一些观点.)
接口是仅抽象方法和最终字段的集合.
Java中没有多重继承.
接口可用于在Java中实现多重继承.
继承的一个优点是我们可以在派生类中使用基类代码而无需再次编写它.可能这是继承在那里最重要的事情.
现在..
Q1.由于接口只有抽象方法(没有代码)所以我们怎么说如果我们实现任何接口那么它是继承?我们没有使用它的代码.
Q2.如果实现接口不是继承,那么如何使用接口来实现多重继承?
Q3.无论如何使用Interfaces有什么好处?他们没有任何代码.我们需要在我们实现它的所有类中反复编写代码.
那么为什么要制作接口呢?
注意:我找到了一个接口有用的案例.它的一个例子就像在Runnable接口中我们有public void run()方法,我们在其中定义线程的功能,并且内置编码,该方法将作为单独的线程运行.所以我们只需要编写线程中的代码,Rest是预定义的.但是这个东西也可以用抽象类和所有东西来实现.
那么使用接口的确切好处是什么?我们使用Interfaces实现了多重继承吗?
人们如何看待在界面中使用的最佳指南?什么应该和不应该进入界面?
我听说有人说,作为一般规则,接口必须只定义行为而不是状态.这是否意味着接口不应包含getter和setter?
我的观点:对于制定者来说可能不是这样,但有时我认为吸气剂可以放在界面中.这仅仅是为了强制实现类来实现那些getter,以便表明客户端能够调用那些getter来检查某些东西,例如.
如果我们有:
public interface Foo{}
public class Bar implements Foo{...}
Run Code Online (Sandbox Code Playgroud)
是否有区别:
public class BarBar extends Bar implements Foo{..}
Run Code Online (Sandbox Code Playgroud)
和
public class BarBar extends Bar{..}
Run Code Online (Sandbox Code Playgroud)
我看到很多像这样的代码,它总是让我感到困惑.是否BarBar
需要实施Foo
?我的意思是,因为它延伸Bar
到开始不是已经存在吗?我想我的问题是,Foo
在BarBar
这里实施的目的是什么?
我见过人们用Map而不是HashMap来声明一个HashMap.
例如Map mapName = new HashMap(); 而我通常使用HashMap mapName = new HashMap(); ;
对于aa HashSet来说,我见过Set setName = new HashSet() ; 使用,而我通常使用HashSet setName = new HashSet()
对于ArrayList(List)等也是如此.
我的问题是,这样做有什么好处,还是仅仅是一个观点?