究竟是什么意思:
汽车是interface
奥迪是class
Car x = new Audi();
我不确定将接口作为类的类型。 感谢
答案 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)
区别在于“声明的类型”和“实现类型”。前者可以是后者之上的任何抽象。
在这种特殊情况下,代码声明Car
由Audi
的实例满足(实现)。在这种情况下,Car
的任何实现都会执行。
更明显的例子就是让一个类的公共成员属于Car
类型。在这种情况下,该类的内部实现需要Car
,任何Car
,以完成某项任务。您可以将其设置为实现Car
的任何对象。
答案 4 :(得分:0)
你正在做的是编写接口而不是实现,在可能的情况下,这是一件好事,因为它允许你在最小的困难时交换实现。这与做的原则相同:
List<String> strs = new ArrayList<String>();
您正在创建一个arraylist,它是实现类型,但引用的类型为list。然后,您可以对符合列表界面的对象执行所有操作 - 如果需要,可以灵活地将实现交换到链接列表,甚至是您自己编码的其他列表,而不会破坏任何其他代码(只要因为它当然已正确实施!)
同样的原则适用于您的汽车对象。