Java Top.

使用Spring 5和Spring Boot 2开始,通过学习春天课程:

>>查看课程

1.概述

继承虽然启动使我们能够重用现有代码,有时我们需要对可扩展性设置限制出于各种原因;这最终的关键字允许我们完成这一点。

在本教程中,我们会看看什么最终的类,方法和变量的关键字手段。

2。最终的班级

标记为的课程最终的无法延长。如果我们查看Java核心库的代码,我们会找到许多最终的那里的课程。一个例子是细绳班级。

如果我们能够扩展,请考虑情况细绳类,覆盖其任何方法,并替换所有的方法细绳与我们具体实例的实例细绳子类。

操作的结果细绳然后对象将变得不可预测。并给出了细绳班级到处都是使用,这是不可接受的。这就是为什么细绳课程标记为最终的

任何尝试继承一个最终的类将导致编译器错误。要演示这一点,让我们创造最终的班级

公共决赛类猫{私人INT重量;//标准getter和setter}

让我们试着扩展它:

公共类Blackcat延伸猫{}

我们会看到编译器错误:

BlackCAT类型不能将最终类猫组成

注意最终的类声明中的关键字并不意味着此类的对象是不可变的。我们可以改变田野自由对象:

CAT CAT =新猫();cat.setweight(1);assertequals(1,cat.getweight());

我们无法扩展它。

如果我们严格遵循良好设计规则,我们应该仔细创建和记录课程或宣布它最终的出于安全原因。但是,我们应该在创建时谨慎使用最终的课程。

请注意,制作课程最终的意味着没有其他程序员可以改善它。想象一下,我们正在使用类,没有源代码,并且有一个方法存在问题。

如果类是最终的,我们无法将其扩展以覆盖该方法并解决问题。换句话说,我们失去了可扩展性,是面向对象编程的好处之一。

3。最终的方法

标记为的方法最终的不能被覆盖。当我们设计一个类并且觉得不应该被覆盖方法时,我们可以制作这种方法最终的。我们也可以找到很多最终的Java核心库中的方法。

有时我们不需要完全禁止一个类扩展,但只能防止覆盖一些方法。一个很好的例子是线班级。扩展它并因此创建自定义线程类是合法的。但它活着()方法是最终的

此方法检查线程是否存在。覆盖的是不可能的活着()有很多原因正确的方法。其中一个是这种方法是本地性的。本机代码以另一种编程语言实现,通常是特定于运行的操作系统和硬件。

让我们创造一个班级并制作它声音()方法最终的

公共类狗{公共最终void sound(){// ...}}

现在让我们延伸班级并试图覆盖它声音()方法:

公共类Blackdog扩展了Dog {Public Void Sound(){}}

我们会看到编译器错误:

-  overrides com金宝搏188体育.baeldung.finaleword.dog.dog.sound  - 无法覆盖狗声音()方法的最终方法是最终的,无法覆盖

如果我们班级的某些方法被其他方法调用,我们应该考虑制作所谓的方法最终的。否则,覆盖它们会影响呼叫者的工作并导致令人惊讶的结果。

如果我们的构造函数调用其他方法,我们通常应该声明这些方法最终的为了上述原因。

制作班级所有方法之间有什么区别最终的并标记班级本身最终的?在第一种情况下,我们可以扩展该类并为其添加新方法。

在第二种情况下,我们不能这样做。

4.最终的变量

标记为的变量最终的无法重新分配。一旦最终的变量是初始化的,无法改变。

4.1。最终的原始变量

让我们宣布一个原始最终的多变的一世,然后分配1。

让我们试着为它分配2的值:

Public Void WhinfinalvariaBleasSign_Thenonlyonce(){Final Int I = 1;// ......我= 2;}

编译器说:

我可能已经分配的最终局部变量

4.2。最终的参考变量

如果我们有一个最终的参考变量,我们也无法重新分配。但这并不意味着它是指它是不可变的。我们可以自由更改此对象的属性。

为了证明这一点,让我们宣布最终的参考变量并初始化它:

最终猫猫=新猫();

如果我们尝试重新分配它,我们将看到一个编译器错误:

无法分配最终的局部变量CAT。它必须是空白的,而不是使用复合分配

但我们可以改变的属性实例:

cat.setweight(5);assertequals(5,cat.getweight());

4.3。最终的领域

最终的字段可以是常量或写入次数。要区分他们,我们应该问一个问题 - 如果我们序列化对象,我们会包括这个领域吗?如果不是,那么它不是对象的一部分,而是一个常数。

请注意,根据命名约定,类常量应该是大写的,其中组件由下划线分隔(“_”)字符:

静态Final Int MAX_WIDTH = 999;

注意任何最终的必须在构造函数完成之前初始化字段

为了静态决赛字段,这意味着我们可以初始化它们:

  • 在声明时,如上例所示
  • 在静态初始化程序块中

例如最终的字段,这意味着我们可以初始化它们:

  • 宣言后
  • 在实例初始化程序块中
  • 在构造函数中

否则,编译器将给我们一个错误。

4.4。最终的争论

最终的关键字在方法参数之前也是合法的。一种最终的在方法内无法更改参数

public void方法withthitheminarguments(final int x){x = 1;}

上述作业会导致编译器错误:

无法分配最终的局部变量x。它必须是空白的,而不是使用复合分配

结论

在本文中,我们了解到了什么最终的类,方法和变量的关键字手段。虽然我们可能不会使用最终的关键词经常在我们的内部代码中,它可能是一个很好的设计解决方案。

一如既往,可以在本文中找到完整的代码GitHub项目

Java底部

使用Spring 5和Spring Boot 2开始,通过学习春天课程:

>>查看课程
2注释
最老的
最新
内联反馈
查看所有评论
评论在本文上关闭!