java实现关键字屏蔽_如何使用关键字Final防止Java中的继承

本文介绍了在Java中如何使用final关键字防止类被继承,以保护类的行为不被子类破坏。通过示例展示了如果不阻止继承可能会导致的问题,并解释了为何String类不可被继承。同时,讲解了如何在方法级别使用final,以限制特定行为的覆盖。
摘要由CSDN通过智能技术生成

通过避免继承来避免破坏类的行为

Java的优势之一是继承的概念,其中一个类可以从另一个类派生,但有时最好防止另一个类的继承。 为了防止继承,在创建类时使用关键字“ final”。

例如,如果一个类可能被其他程序员使用,则如果创建的任何子类可能引起问题,则你可能希望防止继承。 一个典型的例子是String类。 如果我们想创建一个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;

}

}

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

The output is:

The balance is 60.00

The balance is 25.00

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

如果您设计一个供其他程序员使用的类,请始终考虑任何潜在子类的含义。 这就是不能扩展String类的原因。 程序员必须知道,当他们创建一个String对象时,它总是会表现得像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()方法。 任何调用该方法的代码都可以确信它会按原始程序员的意图工作。

喜欢这篇文章的可以点个赞,欢迎大家留言评论,记得关注我,每天持续更新技术干货、职场趣事、海量面试资料等等

> 如果你对java技术很感兴趣也可以交流学习,共同学习进步。

不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代

文章写道这里,欢迎完善交流。最后奉上近期整理出来的一套完整的java架构思维导图,分享给大家对照知识点参考学习。有更多JVM、Mysql、Tomcat、Spring Boot、Spring Cloud、Zookeeper、Kafka、RabbitMQ、RockerMQ、Redis、ELK、Git等Java干货

60a99d21b7666e1776f1a6f3937700f3.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值