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

Java接口类型作为构造函数参数,java,oop,Java,Oop,嗨 我正在学习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{},它有构造函数 publ

嗨 我正在学习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的出色回答之外。我想补充一点,当你编程时,你会发现界面的用途在你开始时并不明显。e、 接口在创建模拟对象的单元测试中非常有用


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

谢谢您的解释。顺便问一下,是
a.dosomething()
,还是
a1.dosomething
?因为a1已经分配给私有实例变量a,所以我认为它应该是
a.dosomething()
。谢谢你的回复。我的意思是C类不是a的子类,不像B。请阅读Java命名约定。INT是常量的名称。这只是一个例子。不包括命名约定