繁体   English   中英

Java接口类型作为构造函数参数

[英]Java interface type as constructor parameters

嗨,我正在学习Java接口。 我在Java教程中读到一个接口是一个引用类型。 假设我声明了一个界面

public interface INT {       public void dosomething();     }

我有3个班,A {},B {}和C {}。

class A{} implements INT. 
class B{} extends A{} and implements INT. 
class C{} implement INT.

然后我有另一个具有构造函数的类D {}

public class D{
  private INT a,b,c ;
  public D( INT a1, INT b1 , INT c1)  {
      a = a1; 
      b = b1;
      c = c1;
  }
  ....
}

然后在main()中,我实例化一个D对象

D myobject = new D( new A(), new B(), new C() );

据说,类层次结构不相关的对象可以用于使用接口相互交互。 所以在上面的类中,C类和A类没有关联,现在界面允许它们相互“交谈”? 我理解这是对的吗? 还有什么其他优点来声明构造函数是接口类型而不是实际的类类型,而不是

private A a, B b, C c ;
public D( A a1, B b1 , C c1) {
   a=a1; b=b1;c=c1;
}

这与多态性有关吗? 对不起,这是我在OO的第一次尝试,所以我在这里缺乏一些了解。

在方法(或构造函数)参数中使用接口类型的巨大优势是其他程序员可以调用它并传入自己的实现接口的类。 编写方法/构造函数时,您不了解的类以及哪些类甚至不存在。 如果使用具体类,调用者必须使用这些类,子类化或更改代码,所有这些都比实现接口更多地限制它们。

你的代码绝对正确。

使用接口而不是真实类的优点是,您只公开对象的通信接口,而不公开对象的实现方式。 它允许您在不破坏客户端代码的情况下随时更改实现。

这个东西叫做封装:从类的外部隐藏实现细节。 这总是一件好事。

关于沟通:他们无法直接沟通。 但是你可以在任何传递的对象上调用方法dosomething,因为它们都实现了相同的接口。 所以,在对象D内的某处你可以写:

a1.dosomething(); // called the method of A
b1.dosomething(); // called the method of B
c1.dosomething(); // called the method of C

目前尚不清楚你的意思是“C类和A类没有关联,现在界面允许它们”相互“”,但你的代码看起来是正确的。

所以在上面的类中,C类和A类没有关联,现在界面允许它们相互“交谈”?

不完全是。 你似乎正确地理解了整个事情,但这部分是模糊的。 这不是界面允许它们彼此交谈,它允许每个人以统一的方式与他们交谈,甚至不知道在特定情况下哪些类代表特定界面。 当然,“每个人”也包括那些课程,所以他们也可以互相交谈,所以你没有错,但这只是无关紧要。 在您的情况下,接口允许D类与A,B和C类进行通信,并且可能与许多其他您甚至不知道的接口实现进行通信。

接口定义了对象可以执行的操作。 一个类定义了它是如何做到的。 它被称为从接口分离实现。 多态性是一种允许这种情况的机制。 当您调用接口方法并调用实现类方法时,它是多态的。

除了@Michael Borgwardt的出色回复。 我想补充一点,在编程时,你会发现在你开始时不明显的接口用途。 例如,接口在用于创建模拟对象的单元测试中非常有用。

当你重构代码并且你知道D只需要INT中的方法时,它们也很有用。 如果A,B,C有其他方法,你知道你可以改变(或删除)它们而不直接影响D.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM