变量作为接口名称

时间:2011-03-20 21:17:20

标签: java oop

究竟是什么意思:

汽车是interface 奥迪是class

Car x =  new Audi();

我不确定将接口作为类的类型。 感谢

5 个答案:

答案 0 :(得分:2)

您的代码将完美无缺;这是一个非常普遍的习语 您可以将变量或字段声明为接口,然后将实现接口的任何类的实例放入其中。

例如,人们经常写

List<Car> myCars = new ArrayList<Car>();

答案 1 :(得分:2)

您没有接口作为类的类型。 x变量的实际(运行时)类型是Audi,它不是接口。在运行时,您可以从不实例化接口,只能实际类型。但是因为您在编译时键入了x变量为Car,所以只有这个接口是已知的,并且您只能调用此接口上的方法:

Car x = new Audi();
x.AMethodOnTheInterface();

答案 2 :(得分:0)

对接口进行编程是一种常见的建议,而不是实现。这就是你在这里做的事情。这意味着x是一个实现Car的对象;也就是说,它可以完成汽车可以做的所有事情,而这就是你所关心的事情(并且可以使用,除非你做一些投射)。它的工作原理是因为奥迪永远是一辆汽车,所以你可以使用它并将其分配到你需要汽车的任何地方。

这是一种常见的,通常是有益的事情;没有铸造,它让你不必担心你的汽车真的是一辆奥迪(如果你的汽车必须是除了奥迪之外的东西,还要编写一堆奥迪特定的代码,这些代码可能毫无用处。)

答案 3 :(得分:0)

区别在于“声明的类型”和“实现类型”。前者可以是后者之上的任何抽象。

在这种特殊情况下,代码声明CarAudi的实例满足(实现)。在这种情况下,Car的任何实现都会执行。

更明显的例子就是让一个类的公共成员属于Car类型。在这种情况下,该类的内部实现需要Car,任何Car,以完成某项任务。您可以将其设置为实现Car的任何对象。

答案 4 :(得分:0)

你正在做的是编写接口而不是实现,在可能的情况下,这是一件好事,因为它允许你在最小的困难时交换实现。这与做的原则相同:

List<String> strs = new ArrayList<String>();

您正在创建一个arraylist,它是实现类型,但引用的类型为list。然后,您可以对符合列表界面的对象执行所有操作 - 如果需要,可以灵活地将实现交换到链接列表,甚至是您自己编码的其他列表,而不会破坏任何其他代码(只要因为它当然已正确实施!)

同样的原则适用于您的汽车对象。