我将通过完整参考中定义的接口。我只是想了解以下段落提到的内容。
“接口旨在支持运行时的动态方法解析。 通常,为了从一个类调用一个方法到另一个类,这两个类 需要在编译时出现,以便Java编译器可以检查以确保 方法签名是兼容的。这个要求本身就是一个静态和 不可扩展的分类环境。在这样的系统中不可避免地会出现功能 在类层次结构中向上和向上推高,以便机制成为 可用于越来越多的子类。接口旨在避免此问题。 它们将一个方法或一组方法的定义与继承断开 层次结构。由于接口与类的层次结构不同,因此可以使用 在类层次结构方面不相关的类,以实现“
那么,作者的意思是,“通常情况下,为了从一个类调用另一个类的方法”?请放下您的观点。
答案 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提供了接口,但不同的数据库供应商提供了驱动程序类实现。因此,您可以调用特定数据库供应商的方法来访问数据库。您需要知道方法签名或要遵守的“合同”,但底层实现来自单独的类。