Java中没有接口的构造函数?
在Java中,如果我有一个接口:Java中没有接口的构造函数?,java,Java,在Java中,如果我有一个接口: public interface MyInterface{ } 然后MyInterface实现是: class MyClass implements MyInterface { public MyClass(int a) { } } 因此,我的意思是,如果用户想要使用构造函数声明一个MyInterface实例: MyInterface mine = new MyInterface(2); 那是不可能的,对吗 那是不可能的,对吗 对。你永远不
public interface MyInterface{
}
然后MyInterface
实现是:
class MyClass implements MyInterface {
public MyClass(int a) {
}
}
因此,我的意思是,如果用户想要使用构造函数声明一个MyInterface
实例:
MyInterface mine = new MyInterface(2);
那是不可能的,对吗
那是不可能的,对吗
对。你永远不能做这样的事
MyInterface mine = new MyInterface(2);
Foo foo = new Bar(2);
在new
之后,您必须选择一个实现接口(*)的类,例如MyClass
:
MyInterface mine = new MyClass(2);
为什么?可以将接口视为类的属性。可以用一个形容词来比喻,比如“红色”。比如说,创建一个红色的球(
newredball()
)或一辆红色的汽车(newredcar()
)是非常有意义的,但是仅仅创建“红色”(newred()
)是没有意义的(“红色什么??)
(*)您可以通过执行
newmyinterface(){…}
动态创建实现接口的匿名类,但从技术上讲,您仍然在实例化一个类。您是正确的。接口不能指定构造函数,构造函数是在实现接口的类中指定的
public interface Foo {
public void doSomething();
}
public class Bar implements Foo() {
public Bar(int value) {
}
@Override
public void doSomething() {
}
}
然后,当您想要使用您的界面时,您需要执行以下操作
MyInterface mine = new MyInterface(2);
Foo foo = new Bar(2);
不能直接实例化接口。您需要使用实现类的实例:
myClass mine = new myClassImpl();
不可能在java接口中定义构造函数签名
public interface Foo {
public void doSomething();
}
public class Bar implements Foo() {
public Bar(int value) {
}
@Override
public void doSomething() {
}
}
如果您希望确保使用特定签名构建对象,您可以选择以下设计模式:
是的,这是不可能的。您想做的事情可以通过以下步骤来完成。您在问题中概述的代码没有说明的一点是,应该实例化实现接口的类。工厂实现是您在代码中表达意图的地方。工厂的大纲可能是这样的,让您开始:
public class FooFactory {
public myClass createFoo() {
if (/* some condition */) {
return new myClassImpl(/* the constructor parameters for that implementation */);
} else {
/* return some other implementation; you get the idea */
}
}
否由于myClass是一个接口,因此不可能声明myClass的实例
public interface Foo {
public void doSomething();
}
public class Bar implements Foo() {
public Bar(int value) {
}
@Override
public void doSomething() {
}
}
接口没有定义构造函数,但是实现接口的类仍然有一个构造函数
如果您的目的是让用户无法调用类的构造函数,则始终可以将构造函数设置为私有的。您的类应该是这样的:
class myClassImpl实现myClass
。同时读到:嗨,这看起来不错。但是如果我有这样的东西:我不能像这样实例化Foo类型:Foo Foo=new Foo()?不,因为Foo是一个接口,它不能被实例化。只能实例化类