Java中没有接口的构造函数?

Java中没有接口的构造函数?,java,Java,在Java中,如果我有一个接口: public interface MyInterface{ } 然后MyInterface实现是: class MyClass implements MyInterface { public MyClass(int a) { } } 因此,我的意思是,如果用户想要使用构造函数声明一个MyInterface实例: MyInterface mine = new MyInterface(2); 那是不可能的,对吗 那是不可能的,对吗 对。你永远不

在Java中,如果我有一个接口:

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是一个接口,它不能被实例化。只能实例化类