Java:在不分配实现的情况下调用接口

Java:在不分配实现的情况下调用接口,java,interface,implementation,Java,Interface,Implementation,是否可以在Java中使用一个接口,由JVM决定哪个实现负责对它的调用 我是说 public class MyClass{ private MyModelInterface myModel; public void doSmoething(){ myModel.calculate(); } } 还是每次都必须像这样将引用传递给接口(-variable)的实现 public class MyClass{ private MyModelInterfa

是否可以在Java中使用一个接口,由JVM决定哪个实现负责对它的调用

我是说

public class MyClass{
    private MyModelInterface myModel;

    public void doSmoething(){
        myModel.calculate();
    }
}
还是每次都必须像这样将引用传递给接口(-variable)的实现

public class MyClass{
    private MyModelInterface myModel;

    public MyClass(MyModel myModel){
        this.myModel=myModel;}

    public void doSmoething(){
        myModel.calculate();
    }
}

在前一个示例中,eclipse编译器没有向我显示任何错误,但是当我尝试将鼠标侦听器或观察者分配给模型视图和控制器之间的此类接口时,JVM会给我空指针异常。我不确定这是否是我的程序中出现这些异常或多线程的原因。

需要以某种方式提供实现

但是关于使用哪种实现的决定可以推迟到运行时使用“直接注入”


我建议您阅读并了解Spring Core。

不,您必须始终传递实现该接口的某个类的实例。JVM无法神奇地决定
calculate()
方法应该做什么。

您引用的示例不是“接口”。您必须使用关键字“接口”。您不能为该接口中的任何方法提供实现。听起来好像您刚刚定义了一个变量,但从未初始化过它(因此称为“nullPointerException”)。是的,但是您仍然需要为接口的实现分配一个引用。如果您得到的是NullPointerException,那么您没有向该类传递有效的引用constructor@FoggyDay:第一行应该是MyClass类中的一个字段。在使用它之前,您必须始终创建一个对象。或者在您可以将其传递给尝试使用它的方法之前。例如,
MyModelInterface myModel=new someClasss,它实现了MyModelInterface()
。JVM不能只是神奇地“做点什么”。为什么你要删除你的观察者/可观察的问题?如果这是可能的,我想这可以解释为什么Eclipse没有向我显示错误。糟糕的是,我假设JVM会处理所有事情,并以错误的方式编写了大量代码。我会读你说的话。谢谢你澄清这一点。