变量作为接口名称
回答
你没有一个接口类型的一类。 x
变量的实际(运行时)类型为Audi
,它不是接口。在运行时您可以从永远不会实例化一个接口,只有实际的类型。但是,因为你已经在编译时输入的x
变量Car
只有这个接口将被已知的,那么就可以调用仅此接口中的方法:
Car x = new Audi();
x.AMethodOnTheInterface();
你的代码将工作得很好;这是一个非常常见的成语。
您可以将变量或字段声明为接口,然后将实现接口的任何类的实例放入其中。
比如,人们经常写
List<Car> myCars = new ArrayList<Car>();
这是编程的接口,而不是常见的咨询到实施。这就是你在这里做的。这意味着x
是实现Car
的对象;也就是说,它可以完成汽车可以做的所有事情,这就是你关心的所有事情(除非你做一些演员,否则可以使用)。它的工作原理是因为奥迪始终是一辆汽车,所以您可以使用它并将其分配到任何需要汽车的地方。
这是一个常见的,并且往往是有益的事情;如果没有演员,你不必关心你的车是否真的是奥迪(并且写一大堆奥迪专用的代码,如果你的爱车除了奥迪之外都有可能是无用的)。
区别在于“声明类型”和“实施类型”之间。前者可以是后者之上的任何抽象。
在这种特殊情况下,代码声明Car
正在满足(实施)Audi
的实例。在这种情况下,将执行任何Car
的实现。
一个更明显的例子是类似Car
的公共成员。在这种情况下,该类的内部实现需要一个Car
,任何Car
,以完成某些任务。您可以将其设置为实现Car
的任何对象。
你在那里做的是编码到一个接口而不是一个实现,在可以的情况下,它是一件好事,因为它允许你在最小的难度下交换实现。这与原理相同:
List<String> strs = new ArrayList<String>();
您正在创建一个arraylist,它是实现类型,但引用是类型list。然后,对符合列表接口的对象执行所有操作 - 如果需要,可以灵活地将实现交换到链接列表或甚至是自己编码的另一个列表,而不会破坏任何其他代码(只要因为它当然是正确实施的!)
同样的原理适用于您的汽车物体。
- 1. 字符串作为变量名称
- 2. 变量作为参数名称
- 3. sass:作为变量的类名称
- 4. 使用变量作为属性名称
- 5. 图像名称作为变量(Swift)
- 6. 使服务器名称作为变量
- 7. 使用保留名称作为变量
- 8. PHP字符串名称作为变量
- 9. 添加变量作为id名称 - flex
- 10. 日期作为变量名称
- 11. 作为变量名称的PHP数组
- 12. jQuery包含变量作为类名称
- 13. Ruby:作为表名称变量
- 14. 变量作为属性名称
- 15. 动作变量名称
- 16. 在Jinja2中使用变量名称作为块名称?
- 17. 如何使用多个变量名称作为对象名称?
- 18. 变量的值作为另一个变量的名称?
- 19. 在Java中使用变量作为其他变量的名称
- 20. 作为新变量名称的Java变量值
- 21. 变量变量名称
- 22. 常规接口语法:使用变量名称
- 23. 通过使用变量名称调用接口
- 24. RouteLink作为链接名称
- 25. 接口变量
- 26. EL中的连接变量名称
- 27. c中的连接变量名称
- 28. 如何通过变量名作为集合名称中的NodeJS
- 29. 长变量名称
- 30. 变量IBOutlet名称?