Java 接口类型的变量

Java 接口类型的变量,java,interface,Java,Interface,我正在学习Java,我在一本书中看到了以下关于接口的描述: 当一个变量被声明为接口类型时,它只是 表示该对象预期已实现该接口 这是什么意思?如果我定义一个接口: public interface Myinterface{ void method_one(); int method_two(); } 然后,我将变量声明为接口类型,例如: Myinterface foo = new Myinterface(); 接口是如何实现的 在什么情况下我应该定义一个接口类型变量 我完全

我正在学习Java,我在一本书中看到了以下关于接口的描述:

当一个变量被声明为接口类型时,它只是 表示该对象预期已实现该接口

这是什么意思?如果我定义一个接口

public interface Myinterface{

   void method_one(); 
   int method_two();
}
然后,我将变量声明为接口类型,例如:

Myinterface foo = new Myinterface();
  • 接口是如何实现的
  • 在什么情况下我应该定义一个接口类型变量

我完全被这本书的描述搞糊涂了…

你没有实例化接口。创建实现接口的类,实例化这些类,但引用接口(与实现类相反)

这允许您的代码保持实现中立,类似于使用
列表
引用,但使用
ArrayList
实现


当与依赖注入相结合时,它也使测试和可扩展性变得更加容易。

您不能实例化接口,也就是说,您不能这样做

MyInterface foo = new MyInterface(); // Compile-time error.
您可以做的是实例化一个实现接口的类。也就是说,给定一个类
MyClass

public class MyClass implements MyInterface {
  // ...

  @Override
  void method_one() {
    // ...
  }
  @Override
  int method_two() {
    // ...
  }
}
您可以实例化它并在变量中放置对它的引用,如下所示:

MyInterface foo = new MyClass();
如果您有另一个类实现了
MyInterface

class MyClass2 implements MyInterface {
  // ...
}
还可以在变量下替换对此类实例的引用:

MyInterface foo = new MyClass2();
Myinterface foo;
这就是接口的威力所在:它们定义了类型,而不是特定的实现,并允许您引用给定类型的任何实现

让类实现接口并使用这些接口引用这些类的实例是一种非常好的编程实践。这种做法有助于提高灵活性和重用性


因此,只要有可能将不同的实现传递到正在实现的方法中,就应该使用接口类型参数和变量。例如,如果您使用的是
HashSet
实例,则应使用
Set
类型的变量来引用它(class
HashSet
实现接口
Set
)。

不能实例化接口。但您可以使用接口名称键入变量:

Myinterface foo = new MyObject();
假设
MyObject
实现
MyInterface

例如,当从外部源获取对象时,它可能很有用。
在这种情况下,您不知道(也不关心)对象的真实类型

您只需要知道并确保它实现了一些接口,这样就可以对对象调用接口方法

假设您有以下变量:

MyInterface foo = new MyClass2();
Myinterface foo;
两个类(
Foo
Bar
),都实现了
MyInterface

然后,您将能够使用
foo
Bar
的实例分配
foo
变量


当然,方法参数也是如此。

谢谢,你能回答我的第二个问题吗,在什么情况下我应该做这件事?为什么会这样?好处是什么?谢谢你,你和亚当都给了我一个非常清楚的解释:)