如何使用关键字final防止java中的继承(prevent inheritance in java using the keyword final)

虽然Java的优势之一是继承的概念,在继承中一个类可以从另一个类派生,但有时需要防止另一个类继承。要防止继承,请在创建类时使用关键字“final”。...

虽然Java的优势之一是继承的概念,在继承中一个类可以从另一个类派生,但有时需要防止另一个类继承。要防止继承,请在创建类时使用关键字“final”。

Computer programmers working

例如,如果一个类可能被其他程序员使用,如果创建的任何子类都可能导致问题,您可能希望阻止继承。一个典型的例子是String类。如果我们想创建一个字符串子类:

public class MyString extends String{}

我们将面临以下错误:

cannot inherit from final java.lang.String

String类的设计者意识到它不是继承的候选对象,并阻止了它的扩展。

为什么要阻止继承?

防止继承的主要原因是确保类的行为方式不会被子类破坏。

假设我们有一个类Account和一个扩展它的子类OverdraftAccount。类帐户有一个getBalance()方法:

public double getBalance() { return this.balance; }

在我们讨论的这一点上,子类OverdraftAccount并没有覆盖这个方法。

(注意:有关使用此Account和OverdraftAccount类的其他讨论,请参见如何将子类视为超类)。

让我们为每个Account和OverdraftAccount类创建一个实例:

Account bobsAccount = new Account(10); bobsAccount.depositMoney(50); OverdraftAccount jimsAccount = new OverdraftAccount(15.05,500,0.05); jimsAccount.depositMoney(50); //create an array of Account objects //we can include jimsAccount because we //only want to treat it as an Account object Account[] accounts = {bobsAccount, jimsAccount}; //for each account in the array, display the balance for (Account a:accounts) { System.out.printf("The balance is %.2f%n", a.getBalance()); } The output is: The balance is 60.00 The balance is 65.05

在这里,一切似乎都按预期进行。但是,如果OverdraftAccount覆盖了getBalance()方法怎么办?没有什么可以阻止它这样做:

public class OverdraftAccount extends Account { private double overdraftLimit; private double overdraftFee; //the rest of the class definition is not included public double getBalance() { return 25.00; } }

如果再次执行上述示例代码,则输出将不同,因为为JimAccount调用了OverdraftAccount类中的getBalance()行为:

The output is: The balance is 60.00 The balance is 25.00

不幸的是,子类OverdraftAccount永远不会提供正确的余额,因为我们通过继承破坏了Account类的行为。

如果您设计一个供其他程序员使用的类,请始终考虑任何潜在子类的含义。这就是无法扩展String类的原因。程序员知道当他们创建字符串对象时,它的行为总是像字符串一样,这一点非常重要。

如何防止继承

要阻止类被扩展,类声明必须显式声明它不能被继承。这是通过使用“final”关键字实现的:

public final class Account { }

这意味着Account类不能是超类,OverdraftAccount类不能再是其子类。

有时,您可能希望仅限制超类的某些行为,以避免子类的损坏。例如,OverdraftAccount仍然可以是Account的子类,但是应该防止它重写getBalance()方法。

在本例中,使用方法声明中的“final”关键字:

public class Account { private double balance; //the rest of the class definition is not included public final double getBalance() { return this.balance; } }

注意final关键字是如何在类定义中不使用的。可以创建Account的子类,但它们不能再重写getBalance()方法。任何调用该方法的代码都可以确信它将按照原始程序员的预期工作。

  • 发表于 2021-09-24 00:33
  • 阅读 ( 173 )
  • 分类:编程

你可能感兴趣的文章

处置()(dispose ())和完成()(finalize ())的区别

...重要的优点之一是它提供自动垃圾回收。它会自动释放未使用对象的内存。在C语言和C++语言中,程序员必须自己处理内存管理。但在C等语言中,构建在.NET框架上的语言提供了垃圾收集器。它有助于管理记忆。它不能用于释放非...

  • 发布于 2020-10-18 23:21
  • 阅读 ( 187 )

静止的(static)和java期末考试(final in java)的区别

...程序员在编写程序时应该遵循这些语法。程序设计语言的关键字根据任务的不同具有特定的含义。它们由编程语言提供,不能用于用户定义的变量、方法、类等。static和final是Java中的两个关键字。本文讨论Java中static和final之间的...

  • 发布于 2020-10-19 07:48
  • 阅读 ( 315 )

最终决赛(final finally)和用java完成(finalize in java)的区别

...方法。因此,所有这些术语都有不同的含义。final是一个关键字,用于防止更改变量、避免方法重写和避免扩展类。最后是异常处理中的一个块,无论是否引发异常,它都将执行。finalize是一个方法,由垃圾回收器在完全销毁对...

  • 发布于 2020-10-19 15:24
  • 阅读 ( 236 )

多态性(polymorphism)和oop中的继承(inheritance in oop)的区别

...类有sub()方法。 类A的sum()方法可以在B类中使用extend关键字。重用现有类中的属性和方法来创建新类称为继承。即使在类B中没有sum()方法;它是从类A继承的。继承对于代码的可重用性很有用。较老的类称为基类、超类或...

  • 发布于 2020-10-19 21:16
  • 阅读 ( 547 )

继承(inheritance)和java接口(interface in java)的区别

继承(inheritance)和java接口(interface in java)的区别 Java是Sun Microsystems公司开发的一种编程语言。Java可以用来开发各种应用程序。它是一种支持面向对象、结构化等多种范式的语言,Java的主要优点是支持面向对象编程(OOP)。程序...

  • 发布于 2020-10-25 00:02
  • 阅读 ( 490 )

java异常:您处理的对吗?

... 下面的代码示例演示了如何包装异常。方法\u 1()在其主体中抛出一个SQLException。要使代码正确编译,必须声明抛出异常。 ...

  • 发布于 2021-03-13 09:11
  • 阅读 ( 253 )

如何正确处理java异常

... 任何抛出选中异常的方法都必须使用throws关键字在方法签名中表示该异常。因为Java是内置的 ...

  • 发布于 2021-03-14 17:31
  • 阅读 ( 234 )

抽象类(abstract class)和java接口(interface in java)的区别

...,只关注关键的细节,从而提高效率,从而降低复杂性。关键字“abstract”用于在类声明中的class关键字之前创建一个抽象类。 抽象类可以包含也可以不包含抽象方法(没有主体的方法),但如果一个类至少有一个抽象方法,则...

  • 发布于 2021-06-25 03:52
  • 阅读 ( 301 )

最终的(final)和静止的(static)的区别

...明中的静态字显示该变量不属于任何对象。有一个类似的关键字,它说变量值只设置一次,不会改变。这是关键字final。这个关键字不限于静态变量,但可以与实例变量、局部变量,甚至与参数方法的变量一起使用。通过将变量...

  • 发布于 2021-06-25 15:47
  • 阅读 ( 297 )

抽象类(abstract class)和java接口(interface in java)的区别

...继承 什么是java中的抽象类(abstract class in java)? 用abstract关键字声明的类称为抽象类。抽象类既可以有抽象方法,也可以有非抽象方法。类可以扩展抽象类并实现抽象类的抽象方法。不能从抽象类创建对象,但可以从扩展抽象类...

  • 发布于 2021-07-01 01:29
  • 阅读 ( 276 )
XzQAA
XzQAA

0 篇文章

相关推荐