首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >界面类型变量

界面类型变量
EN

Stack Overflow用户
提问于 2011-12-06 20:18:08
回答 3查看 18K关注 0票数 16

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

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

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

代码语言:javascript
复制
public interface Myinterface{

   void method_one(); 
   int method_two();
}

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

代码语言:javascript
复制
Myinterface foo = new Myinterface();

  • 接口是如何实现的??
  • 在什么情况下应该定义接口类型变量?

我完全被这本书的描述弄糊涂了。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-06 20:20:00

不能实例化接口,即不能实例化

代码语言:javascript
复制
MyInterface foo = new MyInterface(); // Compile-time error.

您可以做的是实例化一个实现接口的类。也就是说,给定一个类MyClass

代码语言:javascript
复制
public class MyClass implements MyInterface {
  // ...

  @Override
  void method_one() {
    // ...
  }
  @Override
  int method_two() {
    // ...
  }
}

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

代码语言:javascript
复制
MyInterface foo = new MyClass();

如果您有另一个实现MyInterface的类

代码语言:javascript
复制
class MyClass2 implements MyInterface {
  // ...
}

您还可以在变量下面替换对该类实例的引用:

代码语言:javascript
复制
MyInterface foo = new MyClass2();

这就是接口的强大之处:它们定义了类型,而不是特定的,并允许您引用给定类型的任何实现。

让类实现接口并使用它们来引用这些类的实例是非常好的编程实践。此实践极大地促进了灵活性和重用性。

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

票数 22
EN

Stack Overflow用户

发布于 2011-12-06 20:20:40

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

代码语言:javascript
复制
Myinterface foo = new MyObject();

假设MyObject实现了MyInterface

例如,当从外部源获取对象时,它可能很有用。

在这种情况下,您不知道(也不关心)对象的真实类型。

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

假设您有以下变量:

代码语言:javascript
复制
Myinterface foo;

以及两个类(FooBar),它们都实现了MyInterface

然后,您将能够为foo变量分配FooBar的实例。

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

票数 5
EN

Stack Overflow用户

发布于 2011-12-06 20:19:54

您不实例化接口。创建实现接口的类,实例化这些类,但是引用接口(相对于实现类)。

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8406250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档