8

你能用Java实例化一个接口吗?我知道快速回答是“不”。但是有些东西我不太理解。

这里发生了什么?

SharedPreferences是一个公共接口。然而,我们没有像我在书中读到的那样使用这个接口,我们没有创建一个类并实现 SharedPreferences。相反,我们像这样使用这个 API:

SharedPreferences pref = Context.getSharedPreferences("some value", 0);

那么这段代码中到底发生了什么?

我认为它就像getSharedPreferences()正在创建一个SharedPreferences我们可以使用和操作的对象。

但是SharedPreferences是一个接口......我被告知你必须实现接口而不是创建它们的对象。这在Java中是什么?

当我查看 Java API 时,我看到一个定义为公共接口的类。我如何知道何时实现该接口或何时从中创建此类对象?

4

5 回答 5

7

你永远不能在java中实例化一个接口。但是,您可以通过接口的类型来引用实现接口的对象。

所以发生的事情是getSharedPreferences返回一个实现该接口的对象。返回对象的类型并不重要。重要的是它实现了该接口的所有方法,因此它可以用作SharedPreferences

于 2013-04-14T09:35:38.880 回答
4

SharedPreferences是一个参考,但你没有创建一个SharedPreferences对象。相反,您正在创建一个属于该类型的对象;即,该类型的实现。例如,查看以下参考资料,您可以在其中使用接口作为实例的参考类型,该实例实际上是参考类型接口的实现。http://docs.oracle.com/javase/tutorial/java/IandI/interfaceAsType.html

于 2013-04-14T09:32:01.897 回答
3
 SharedPreferences pref = Context.getSharedPreferences("some value", 0);

在这段代码中,对象的类型是 SharedPreferences 但实例是实现 SharedPreferences 接口的类这是 OOP 的基本概念

于 2013-04-14T09:29:43.417 回答
2

然而,我们没有像我在书中读到的那样使用这个接口,我们没有创建一个类并实现 SharedPreferences。

无需创建实现此接口的类,因为有人已经为您创建了一个。您通过它的接口使用这个类,甚至不知道类名。这就是接口的用途

于 2013-04-14T09:42:24.960 回答
0

SharedPreferences是一个在 中实现的接口Context。您在这里看到的是一个向接口抽象的示例:通过将pref变量定义为接口,您可以更轻松地更改代码(您当前的类现在与该类松散耦合,Context而不是直接链接到它)。

返回的对象Context.getSharedPreferences将是类型SharedPreferences

于 2013-04-14T09:30:36.647 回答