类实现接口

时间:2017-07-10 08:27:48

标签: class interface implements

所以我开始学习接口,现在我想知道何时使用

Interface i = new Class();

以及何时使用

Class c = new Class();

我注意到如果我是第一种方式,只能使用接口方法,我就不能使用类方法。你知道为什么吗?

抱歉,我仍然是Java的菜鸟,感谢您的回答

2 个答案:

答案 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的对象替换,而不会改变该程序的任何所需属性。