所以我开始学习接口,现在我想知道何时使用
Interface i = new Class();
以及何时使用
Class c = new Class();
我注意到如果我是第一种方式,只能使用接口方法,我就不能使用类方法。你知道为什么吗?
抱歉,我仍然是Java的菜鸟,感谢您的回答
答案 0 :(得分:1)
让我以简单的方式说明。
接口定义了类的行为,实现接口的类将为该行为提供实现。
这是一个例子
Interface Shape
{
void draw();
}
Class Circle implements Shape
{
void draw()
{
... code to draw circle
}
void printRadius()
{
}
}
Class Rectangle implements Shape
{
void draw()
{
... code to draw rectangle
}
void printDiagonal()
{
}
}
现在,如果您看到相同的Shape接口是由2个类实现的,那么。
现在我可以像这样写
Shape shape = new Circle(); // This will allow you access only draw method
Circle circle = new Circle(); // This will allow you access all methods of circle
如果您希望您的客户/消费者仅访问像draw这样的Shape特定方法,那么如果您想使用Circle特定方法(例如printRadius),请使用Shape shape = new Circle()
else,然后使用Circle circle = new Circle()
答案 1 :(得分:0)
OOP范例中的接口用于在有些类似对象的组中推广通用行为。因此,您使用更通用类型的变量,例如接口您将只能使用接口定义的常用方法。因为您应该能够为接口变量分配任何接口后代(实现给定接口的类)并能够使用它。因此,当您指定
时Interface i = new Class();
您可以访问的唯一方法是Interface
中定义的方法。另外需要注意的是,该变量将被动态地绑定到运行时类型,例如,对于示例中的Class
,因此对您接口中定义的方法的调用将被分派到该类的实现。
还要考虑以下内容,例如您有定义:
interface Vehicle {
public void drive();
public void stop();
}
现在,如果您编写代码:
Vehicle v = new BMW()
v.drive()
// do something else
v.stop()
当您将new BMW()
替换为new Mitsubishi()
时,它的行为应该相同,无论您的BMW
课程中可能有这样的事实
class BMW {
public void listenMusic()
}
这也称为" Liskov substitution principle"
利斯科夫的行为亚型概念定义了对象的可替代性概念;也就是说,如果S是T的子类型,那么程序中类型T的对象可以用类型S的对象替换,而不会改变该程序的任何所需属性。