接口完整参考

时间:2011-10-25 04:17:13

标签: java interface

我将通过完整参考中定义的接口。我只是想了解以下段落提到的内容。

  

“接口旨在支持运行时的动态方法解析。   通常,为了从一个类调用一个方法到另一个类,这两个类   需要在编译时出现,以便Java编译器可以检查以确保   方法签名是兼容的。这个要求本身就是一个静态和   不可扩展的分类环境。在这样的系统中不可避免地会出现功能   在类层次结构中向上和向上推高,以便机制成为   可用于越来越多的子类。接口旨在避免此问题。   它们将一个方法或一组方法的定义与继承断开   层次结构。由于接口与类的层次结构不同,因此可以使用   在类层次结构方面不相关的类,以实现“

那么,作者的意思是,“通常情况下,为了从一个类调用另一个类的方法”?请放下您的观点。

3 个答案:

答案 0 :(得分:4)

这意味着如果您不使用接口,并尝试执行以下操作:

someObject.doSomething();

...(换句话说,在其他一些类上调用一个方法),在编译时你必须可以使用其他类,否则编译器将不知道如何编译方法调用{{1方法。

另一方面,如果您对doSomething所知道的是它实现了一个具有someObject方法的接口,那么只有接口需要可供编译器完成其工作。然后其他人可以调用你编译的代码,传入一个在编译时不可用的包中的对象,只要它实现你的接口。

答案 1 :(得分:2)

帕,

所有“通常,为了从一个类调用另一个类的方法”意味着“正常的方法调用”,例如:

Foo foo = new Foo();
foo.bar();  <<== method invocation

要调用方法,您需要知道签名 ...在面向对象的世界中,要调用方法,您不需要知道如何该方法有效,你只需要知道它的签名......即什么调用该方法,它需要什么参数(如果有的话),以及它返回的内容(如果有的话)。

我们在接口文件中放置“如何调用此方法”,与类文件分开,类文件定义“此方法如何工作”

但是为什么???实现类可以由不同的程序员在不同的组织中创作,在界面之后几年。新类将使用原始代码,因为它公开了预期的接口

这有点清楚吗?

干杯基思。


编辑:继续上面的例子......让我们假装几年前Universal Universalans数据交换格式的第三次研讨会发布了一个“标准界面”(饮料之间),以使当地业主能够维持一个共同的数据库关闭“问题饮酒者”:

interface Barable {
    void bar();
}

当我们踢出一个愚蠢的赞助人时:

class Patron {
    void kickOut() {
        // ServiceLocator finds a class which implements the Barable interface.
        Barable service = ServiceLocator.ByInterface("Barable"); 
        service.bar(); <<-- Invoke it. We don't care HOW it works, or WHO implemented it!
    }
}

答案 2 :(得分:1)

界面只是一种访问某种东西的方式。

类必须实现接口并提供实现。

public interface Account{

openAccount();

deleteAccount();

}

public class AccountImpl implements Account{

 public void openAccount(){
  // create an account here
 }

 public void deleteAccount(){
  // create an account here
 }

}

另一方面,你也可以: -

public class AccountImpl{
     public void openAccount(){
      // create an account here
     }

     public void deleteAccount(){
      // create an account here
     }
} 

并不是每个类都需要有一个接口来提供实现。

例如,在JDBC世界中,oracle提供了接口,但不同的数据库供应商提供了驱动程序类实现。因此,您可以调用特定数据库供应商的方法来访问数据库。您需要知道方法签名或要遵守的“合同”,但底层实现来自单独的类。