其他(非访问)类修饰符

可以使用final、abstract或strictfp修饰类声明,这些修饰符能够加在所有类访问的控制上。因此,可以将类同时声明为public和final。但是,不能总是混用非访问修饰符。例如,可以随意组合使用strictfp和final,但是,永远不要将类同时标识为final和abstract。


不必了解strictfp时如何工作的,它能够用于修饰类或方法,但绝对不能修饰变量。将类标识为strictfp,意味着该类中的代码在处理浮点数时将遵守IEEE 754标准。如果没有这个修饰符,方法所有浮点数的操作方式可能与平台有关。如果不将类声明为strictfp,则仍然可以通过将方法声明为strictfp来使方法获得strictfp操作。


最终(final)类。当用于类声明时,final关键字指该类不能再有子类(即不能被子类化)。换句话说,任何其他类都不能扩展(继承自)final类。否则会议编译错误而告终。

 那么,为什么将类标识为final呢?这是否违反了整个面向对象的继承概念?只有当需要确保类中的所有方法都不要重写时,才应该建立final类。如果你深度依赖某些方法的实现,那么使用final将为你提供安全,使得没有任何人能够改变它的方法。

你会注意到,Java核心库中的许多类都是final类。例如,String类就不能被子类化。设想一下,如果不能保证String对象在应用程序运行的任何特定系统上怎样工作,岂不会乱的一塌糊涂!如果程序员随意扩展String类(从而能够在需要Java.lang.String实例的地方,替换为他的心String子类实例),文明-如我们所了解的-可能崩溃。因此,为了安全性请使用final,但是,只有确信final类确实表达了所有那些需要在他方法中表达的内容时,才应该使用final。本质上,将标识为final类。意味着该类从来不会被其他程序员改进,更不可能由他所专用 。


在实际使用中。几乎从不需要建立final类。final类淹没了面向对象的一个主要的优点--可扩展性。因此,除非有非常重要的安全要求或安全考虑,否则要考虑将来某一天其他程序员扩展你的类。如果将你的类声明了final,则负责维护你的代码的程序员会像猎人一样对你穷追不舍,直到将你“抓获”。


抽象(abstract)类。abstract类永远不会被实例化。其唯一的目的、使命和存在的目的是用于扩展(即被子类化)。(但要注意,可以编译并执行一个abstract类,只要不去试图创建它的实例即可)。为什么要建立一个不能从它产生对象的类呢?因为类也可能是抽象的。例如,假设有一个Car类,它具有一些适用于所有车辆的通用方法,但是不能让任何人实际创建一个通用的、抽象的Car对象。

注意。标识为abstract的方法以分号结尾,而不是波形括号结尾的。

不能将一个类同时标识为abstract和final。它们有着近乎相反的意义。abstract类必须被子类化,final类不能被子类化。