当前位置: 首页 > 网络应用技术

Java中的摘要和界面简介

时间:2023-03-06 18:54:42 网络应用技术

  我什么时候应该选择一个抽象类,而不是Java中的接口?接受挑战!了解这些Java语言元素以及如何在程序中使用它们之间的区别。

  在Java代码中,即使在Java开发工具包(JDK)本身中,也有大量的抽象类别和接口。east代码元素具有基本目的:

  许多开发人员认为界面与抽象类相似,但实际上它们是完全不同的。LET讨论它们之间的主要区别。

  本质上,接口是合同,因此取决于实现其目的的实现。一个接口是不可能的,因此它不能使用变量实例变量。一个接口只能使用最终变量。

  该接口对于解耦代码和多态性的实现非常有用。我们可以在JDK中看到一个示例,即接口:

  您可能会注意到,此代码很简短且非常强大。我们可以轻松地看到该方法的签名,我们将使用特定类在接口中实现该方法。

  该界面包含一份合同,可以由、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、岸”的

  为了使用多态性,我们可以简单地用来声明我们的变量类型,然后选择任何可用的实例。

  以下是此代码的输出:

  在这种情况下,实现方法的使用方法是使用该接口的好场景。如果您注意到许多类别属于父类,该方法是相同的,但是行为是不同的,则使用接口是一个好主意。

  接下来,让我们看一下我们可以使用界面做多少件事。

  请记住,接口是必须由特定类实现的合同。接口方法是隐式抽象,并且需要特定类。

  这里有一个示例:

  以下是此代码的输出:

  请注意此细节,接口方法是隐藏的,这意味着我们无需清楚地将它们声明为抽象。

  要记住的另一个规则是,一个接口只能包含常数变量。因此,以下代码还可以:

  请注意,这两个变量是隐式的。这意味着它们是恒定的,不取决于示例,不能更改。

  如果我们尝试更改界面中的变量,例如,这样的变量:

  我们将触发汇编错误,这样:

  当Java 8中引入默认方法时,一些开发人员认为它们将与摘要相同。但是,这是不正确的,因为接口不能处于状态。

  可以实现默认方法,而抽象方法不能。默认方法是Lambdas和Flow的巨大创新的结果,但是我们应该谨慎使用它们。

  在JDK中使用默认方法的一种方法是它是接口的一部分。我们可以简单地重复使用该方法,而不是将代码复制到每个实现:

  任何实现都可以在没有新方法的情况下使用。然后,我们可以通过默认方法重复使用代码。

  让我们创建自己的默认方法:

  以下是输出结果:

  关于默认方法,应注意需要实现每个默认方法。默认方法不能静态。

  现在,让我们继续讨论抽象类别。

  抽象类可以具有实例变量。这意味着可以使用实例变量并突变。这里有一个示例:

  以下是输出结果:

  像接口一样,抽象类别可以是抽象的。提取方法是一种没有主题的方法。类似于接口,必须清楚地将抽象类中的抽象方法声明为抽象。

  尝试在没有实施的情况下声明方法,并且没有关键字,诸如此类:

  造成汇编错误,这样:

  当您需要实现状态时,使用抽象类是一个好主意。作为一个示例,Java Collection框架包括使用该变量状态的抽象清单类。

  通常,当您不需要保持状态时,通常会更好。

  设计模式中的模板方法是抽象类的一个很好的示例。模板方法模式在特定方法中操作实例变量。

  从面向对象的编程的角度来看,接口和抽象类之间的主要区别在于接口不能具有状态,而抽象类可以使用实例变量来具有状态。

  另一个关键区别是,该类可以实现多个接口,但是它们只能扩展一个抽象类。这是基于多个继承(扩展一个类)的设计决策,导致代码僵局。Java的工程师决定避免这种情况。

  另一个区别是该接口可以通过接口实现或扩展,但是只能扩展类。

  应该注意的是,lambda表达式只能用于功能接口(仅用一种方法参考接口),而lambdas只能使用一种抽象方法。

  让我们通过Java代码挑战探索接口和抽象类之间的主要区别。我们在下面提供代码挑战,您还可以以视频形式观察抽象类和接口的挑战。

  在以下代码中,还同时声明了接口和抽象类,并且在代码中也使用了lambdas:

  您认为在运行此代码时会发生什么?请从以下选项中选择一个。

  选项A选项B选项C选项D选项E,您是否为此挑战选择正确的输出?请观看视频或继续阅读以回答。

  此Java代码挑战显示了有关接口和抽象方法的许多重要概念。按行浏览代码将使我们理解输出中发生的许多事情。

  代码的第一行挑战包括接口的lambda表达式。请注意,在此lambda中,我们正在添加静态字段。示例字段也可以在此处使用,但是在lambda之外声明的本地变量不好。到目前为止,可以正常编译此代码。还应注意,lambda表达式尚未执行,因此该字段不会增加。

  在这一点上,我们将打印字段,并且尚未增加,因为λ表达式尚未被调用,并且只是声明了。因此,该行的输出将为:

  此Java代码挑战中的另一个有趣的概念是我们正在使用一个匿名的内部类。这基本上意味着任何将获得抽象类的类。我们并没有真正立即实例化抽象类,因为它实际上是一个匿名类。第一个特定类始终有义务在扩展它们时实现抽象方法。

  在接口中,我们用lambda表达式声明接口。因此,当我们调用该方法时,我们将打印以下内容:

  下一行代码调用我们在开始时创建的lambda表达式。因此,此变量将增加。

  现在,我们将从中间调用该方法,该方法将更改其实例变量。注意代码的这一部分显示接口和抽象类之间的最大差异。

  最后,我们打印了值。因此,输出结果将是:

  总而言之,正确的输出是选项C: