JAVA开发相关外文翻译资料

 2022-01-02 09:01

英语原文共 719 页,剩余内容已隐藏,支付完成后下载完整资料


13.1导言

欢迎回到我们编程课程的第二学期。我们花了第一个学期,奠定了基础,你需要开发程序的Java。在那期间你走了很远的路。你们 了解了变量、控制结构、方法和数组的概念,然后继续开发自己的类并使用继承扩展这些类。最后,你开发了由许多类组成的应用程序。它们紧密地一起工作,通过吸引人的图形界面与用户交互。在此过程中,您还了解了UML表示法和测试策略。在那学期开始的时候,你可能没料到你会走得这么远。嗯,第二学期可能看起来同样有挑战性,但是,在我们的帮助下,你可以期待新的和更先进的挑战。

在第一学期,直到我们发展了我们的案例研究,我们创建的应用程序是相当简单的,只包含一个或两个类的大部分。 团队成员将开发不同的模块,这些模块稍后可以 集成一个应用程序。当一组程序员以这种方式一起工作时,他们常常必须就如何开发自己的单独类达成一致,这样他们才能成为 后来成功地整合了。在本章中,我们将看到如何通过使用一种称为接口的特殊类在Java程序中形式化这些协议。然后我们将继续讨论 lambda表达式的主题,我们在第十章中介绍了它。在Java 8发行版中引入lambda表达式是对语言的一个非常重要的补充,在本章中,您将看到它们是多么有用。

13.2一个例子

一个类的属性应该只允许使用一组特定的值,这是非常常见的情况。例如,想想上学期我们开发的BankAccount类。很可能,帐号应该被限制为包含,比如说,精确的八位数的数字。类似地,Customer类可能要求客户编号包含个字母,后面跟着四位数。在某些情况下,存在的约束并不是因为我们选择强加它们,而是因为它们是“自然的”,例如,如果oblong类的对象的长度或高度小于或等于零,那就没有意义了。

在这种情况下,在开发类时必须尽一切努力防止将无效的值分配给属性。构造函数和其他方法应该被设计成在进行这种尝试时标记错误——并且面对对象编程语言的优势恰恰在于他们允许我们以这种方式限制对属性的访问。

尽管有上述意见,但在工业规模的项目中, 类将非常复杂,并将包含许多方法。因此 开发人员可能会忽略某一点的约束,并允许对象 违反了规则。因此,如果为了测试目的,每个对象都可以包含一个方法,我们可以称之为检查,那么这可能是有用的 用于检查对象的完整性。

在特定的项目中,人们可以独立于开发模块的人编写测试例程,这些例程将调用Check方法。因此,我们需要能够确保每个对象都包含这样的检查方法。

你在第九章学到的。保证一个类具有特定方法是让该类从包含抽象方法的类继承— 当一个类包含抽象方法时,该类的任何子类都是强制重写该方法——如果不重写,就会出现编译器错误。

在我们的示例中,我们需要确保我们的类都有一个检查方法测试对象的完整性,因此实现这一点的一种方法是编写一个类,如下所示:

public abstract class Checkable

{

public abstract boolean check();

}

现在,我们所有的类都可以扩展checkable,并且能够成功地编译。除非他们每个人都有自己的检查方法。

虽然这是可行的,但它确实给我们带来了一些问题。例如,如果我们的长方形类将成为一个图形应用程序的一部分,并且需要扩展另一个类(如Application),那么会发生什么情况呢?这是有问题的,因为在Java中,一个类不允许从多个超类继承。从多个类继承称为多重继承,如图所示.

不允许多重继承的一个原因是它很容易导致歧义,从而导致编程错误。例如,想象一下13.1图中所示的两个超类。两者都包含名称相同的方法-子类将继承该方法的哪个版本?
幸运的是,有一种方法可以绕过这一点,因为Java允许一种轻量继承,这是由一个称为接口的结构实现的。

13.3 接口

接口是包含抽象方法的特殊类。当我们想让一个类继承一个接口的方法时,我们使用的是“实现”这个词,而不是扩展。就像继承一样,一旦一个类实现了一个接口,它就具有与该接口相同的类型,并且是属于它自己的类型。因此,例如,如果一个类实现了EventHandler,那么该类的任何对象都是。一种EventHandler-换句话说,它的类型是EventHandler,也就是属于它自己的类型。

Java库,特别是那些与图形应用程序相关联的库,包含了大量的接口。而且,我们完全有可能编写自己的接口,就像我们将Checkable类转换为接口时所做的那样。

图13.2显示了接口实现的UML表示法-您可以看到接口被标记为接口标记,并且有一个圆圈用于指示实现接口的类。

如图13.2所示,虽然只可以从一个类继承,但完全可以实现任意数量的接口。在这种情况下,SomeOtherClass扩展了SomeClass并实现了SomeInterface和SomeOtherInterface-因为这些方法是抽象的,它们实际上并没有在接口中编码,这意味着我们前面描述的多重继承的问题不会出现。

在Java8发布之前,接口只能包含抽象方法,但现在接口也可以包含静态方法和默认方法。一直允许常规类具有静态方法(正如您在前面的第8章中看到的那样)。现在它们也可以包含在接口中。默认方法是一个新的概念,专门用于接口(如果需要)。默认方法是具有完整实现的常规方法,因此实现接口的所有类都会自动继承该方法(但如果选择,实现类可能会重写此实现)。将默认方法添加到接口意味着可以对接口进行添加,而不需要对实现该接口以前版本的每个类进行更改(如果我们向接口添加新的抽象方法,就会发生这种情况)。在后面的章节中,我们将讨论具有静态方法和默认方法的接口,但在本章中,我们将只关注具有抽象方法的接口。

与继承一样,类必须重写它实现的接口的所有抽象方法。通过实现接口,我们保证子类将具有特定的方法。

因此,如果我们需要一个类,比如Checkable,其中所有的方法都是抽象的(除了任何静态方法),我们不会创建一个类,而是创建一个接口。

让我们将Checkable类转换为一个接口。代码如下所示:

public interface Checkable

{

public boolean check();

}

注意单词interface而不是class,还要注意我们不必将方法声明为抽象的,因为根据定义,接口的所有非静态方法都是抽象的。

让我们通过定义实现Checkable接口的子类来实现Checkable来创建第8章中的OBLONG类,我们将需要重写构造函数,当然还需要编写Check方法的代码。类现在将如下所示:

public class CheckableOblong extends Oblong implements Checkable

{

//override the constructor

public CheckableOblong(double lengthIn, double heightIn)

{

super(lengthIn, heightIn);

}

@Override

public boolean check() // the check method of Checkable must be overridden

{

// the length and height must both be greater than zero

return getLength() gt; 0 amp;amp; getHeight() gt; 0;

}

}

您可以看到,该类现在实现了我们的Checkable接口:

public class CheckableOblong extends Oblong implements Checkable

Check方法(该类被强制重写)(请注意@Overlay注释的使用),如果属性均大于零,则返回值true,否则返回值false:

@Override

public boolean check() // the check method of Checkable must be overridden

{

return length gt; 0 amp;amp; height gt; 0;

}

其他类可以类似的方式实现Checkable接口。您还记得我们在第8章中开发的BankAccount类吗?其中一个属性是帐号。实际上,账户号码需要遵守某些规则-在英国最常见的规则是,账户号码应该只包含数字,而它应该只包含8个数字。让我们创建一个CheckableBankAccount类,它检查是否支持此规则。

public class CheckableBankAccount extends BankAccount implements Checkable

{

// override the constructor

public CheckableBankAccount(String numberIn, String nameIn)

{

super(numberIn, nameIn);

}

@Override

public boolean check()

{

// check that the account number is exactly 8 characters long

if(getAccountNumber().length() != 8)

{

return false;

}

// check that the account number contains only digits

for(int i=0; i lt;= 7; i )

{

if(!Character.isDigit(getAccountNumber().charAt(i)))

{

return false;

}

}

return true;

}

}

您可以在这里看到,在Check方法中,我们首先检查字符串是否只包含8个字符,然后使用Character类的isDigit方法检查每个字符是否为数字。

在下面的Checker类中,我们创建了五个对象-两个CheckableBlong对象和三个CheckableBankAccount对象。在每种情况下,第一个对象都是有效的,但是其他对象违反了我们为这两个类设置的规则。

您应该注意到,在每种情况下,对象-无论是长方形还是银行帐户-都是Checkable类型(也是特定类的一种类型),这是因为CheckableOblong和CheckableBankAccount都实现了Checkable接口。

public class Checker

{

public

全文共27785字,剩余内容已隐藏,支付完成后下载完整资料


资料编号:[2472]

原文和译文剩余内容已隐藏,您需要先支付 30元 才能查看原文和译文全部内容!立即支付

以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。