接口类型的变量

Mel*_*lon 12 java interface

我正在学习Java,我在书中看到了以下关于界面的描述:

当一个变量被声明为接口类型时,它只是意味着该对象应该已经实现了该接口.

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

public interface Myinterface{

   void method_one(); 
   int method_two();
}
Run Code Online (Sandbox Code Playgroud)

然后,我声明一个变量为接口类型,例如:

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

我完全对这本书的描述感到困惑......

Ada*_*man 18

你不能实例化一个接口,即你做不到

MyInterface foo = new MyInterface(); // Compile-time error.
Run Code Online (Sandbox Code Playgroud)

你可以做的是实例化一个实现接口的类.也就是说,给一个班级MyClass

public class MyClass implements MyInterface {
  // ...

  @Override
  void method_one() {
    // ...
  }
  @Override
  int method_two() {
    // ...
  }
}
Run Code Online (Sandbox Code Playgroud)

你可以实例化它并在你的变量中放置它的引用,如下所示:

MyInterface foo = new MyClass();
Run Code Online (Sandbox Code Playgroud)

如果你有另一个类实现 MyInterface

class MyClass2 implements MyInterface {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

你也可以用你的变量替换对这个类的实例的引用:

MyInterface foo = new MyClass2();
Run Code Online (Sandbox Code Playgroud)

这就是接口的力量所在:它们定义类型,而不是特定的实现,让您参考给定类型的任何实现.

使类实现接口并使用它们来引用这些类的实例是一种非常好的编程习惯.这种做法有助于实现大量的灵活性和重用.

因此,只要可以想到可以将不同的实现传递给您正在实现的方法,就应该使用接口类型参数和变量.例如,如果您正在使用HashSet<T>实例,则应使用类型变量Set<T>来引用它(类HashSet<T>实现接口Set<T>).


Mac*_*ade 5

您无法实例化接口。但是您可以使用接口名称输入变量:

Myinterface foo = new MyObject();
Run Code Online (Sandbox Code Playgroud)

假设MyObject实现MyInterface.

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

您只需要知道并确保它实现了某个接口,这样您就可以调用该对象的接口方法。

假设您有以下变量:

Myinterface foo;
Run Code Online (Sandbox Code Playgroud)

还有两个类(FooBar),都实现了MyInterface.
然后,您将能够使用和foo的实例分配变量。FooBar

当然,这同样适用于方法参数。