1

我对Java很陌生,请坚持下去。好吧,我知道接口“提供”仅由具体子类实现的抽象方法。希望这是真的(至少)。所以我正在研究一个jxl api的示例代码,编写和读取一个excel文件,我到了这一点:

workbook = Workbook.createWorkbook(new File("/home/me/workspace/files/output.xls"));
WritableSheet sheet = workbook.createSheet("first sheet", 0);

也就是说,工作簿对象之前已实例化并且是 WritableWorkbook 对象。我正在使用 Workbook 提供的静态方法创建工作簿,该方法是 WritableWorkbook 的超类。直到这个,我在那里。但是,那么,我在第二条指令中做了什么?工作表是“WritableSheet”,但这是一个接口!看到api,没有实现类。而“WritableSheet”是另一个接口“Sheet”的子接口。两个接口。但是,我认为我无法从接口创建对象。然后,使用 createSheet 方法(由 WritableWorkbook 提供),似乎我正在创建一个 WritableSheet。然后在示例代码中我到达了这个:

Label lblNome = new Label(0, 1, "Nome:");
sheet.addCell(lblNome);

第一行没问题,我新建一个元素,一个标签(也就是一个文本单元格);但第二个?再说一遍,addCell 是一个看到 api 的接口方法!while sheet 之前的执行是什么?在我看来是一个界面。如果接口提供抽象方法,他们正在使用哪种方法?

请你澄清一下?最后代码可以工作,但不清楚这些接口(Sheet 和 WritableSheet)是如何工作的。

谢谢

4

2 回答 2

1

所有对象都是具体类的实例。也许您在 javadoc 中看不到任何实现类,但有一个。它可能是由 返回的匿名或私有类实例createSheet,如下所示:

public WritableSheet createSheet() {
    return new WritableSheetImpl(...);
}

private class WritableSheetImpl implements WritableSheet {
    // implementation of all the methods of WritableSheet here
}
于 2012-01-12T12:35:05.127 回答
0

Java 中的接口定义了一个契约,它们是类型!可能有几个类签署了这个合同——我们说这些类正在实现接口。

您可以将签署合同的类创建的任何对象视为该合同的对象。它可以被强制转换为契约——我们说您可以将任何对象从实现接口的类强制转换为该接口类型。

静态工厂方法createSheet()就是这样做的。它在内部使用一个具体的类来实现WritableSheet并返回它的一个对象。由于createSheet()的返回类型是WritableSheet,它被强制转换为类型WritableSheet。一定要理解我们没有创建一个对象WritableSheet——我们不能,因为它是一个接口。但是我们可以任何实现接口的类的对象转换为type WritableSheet

一个主要优点是createSheet()可以在不影响使用它的客户端代码的情况下静默更改内部使用的实现。当createSheet()切换到另一个实现时,WritableSheet您不必更改客户端代码中的任何内容!

您的代码依赖于接口定义的契约,而不是具体的实现。这很好!

于 2012-01-12T12:18:26.560 回答