我在AP CS,并试图弄清楚这是否有效。
public interface Controller
public class Widget implements Controller
public class Thingy extends Widget
Controller myControl = new Thingy();
假设顶部的接口/类实际定义。第四行(Controller myControl = new Thingy();
)是否有效,或者你不能从这样的界面创建一个对象?
答案 0 :(得分:2)
你可以。
在这种情况下,您将实例化Thingy
的实例,这是一个具体的类。您刚刚将其声明为Controller
类型。这只意味着使用它的任何东西都只能访问接口Controller
中可用的方法(除非它们是向下转换,使用反射等)。这是一种很好的做法,因为它允许您交换myControl
的实际实现,并且对象的用户不关心。
答案 1 :(得分:1)
这是多态性和继承的基础 - 你应该生活和完全理解OOP的两个术语。
考虑一下:
你有一个Car界面,一个实现Car的SportsCar对象和一个扩展SportsCar的Porsche对象。
SportsCar IS-A Car所以你可以说:Car myCar = new SportsCar();
保时捷IS-A SportsCar,您可以说:SportsCar myCar = new Porsche();
出于同样的原因,保时捷IS-A Car让你可以肯定地说:
Car myCar = new Porsche();
底线是:超类(接口,抽象类或其他)可以保存对其子类的引用。
答案 2 :(得分:0)
这将创建类 Thingy 的实例,该实例实现 Controller 。 Controller 接口本身无法实例化。