首页 > 编程语言 >Java的final修饰符

Java的final修饰符

时间:2023-04-24 14:25:14浏览次数:27  
标签:Java String 子类 修饰符 实例 方法 final

final 实例域

可以将实例域定义为 final。对于 final 域来说,构建对象时必须初始化 final 实例域,构造对象之后就不允许改变 final 实例域的值了。也就是说,必须确保在每一个构造器执行之后,final 实例域的值被设置,并且在后面的操作中,不能够再对 final 实例域进行修改。

例如,可以将 Employee 类中的 name 域声明为 final,因为在对象构建之后,这个值不会再被修改,即没有 setName() 方法。

class Employee {
	private final String name;
    ...
}

final 修饰符大都应用于基本(primitive)类型域,或不可变(immutable)类的域(如果类中的每个方法都不会改变其对象,这种类就是不可变的类。例如,String 类就是一个不可变的类)。

对于可变的类,使用 final 修饰符可能会对读者造成混乱。例如,private final StringBuilder evaluations; 在 Employee 构造器中会初始化为 evaluations = new StringBuilder(); final 关键字只是表示 evaluations 对象变量不会再指向其他的 StringBuilder 对象。不过这个 StringBuilder 对象可以更改。

public void giveGoldStar() {
	evaluations.append(LocalDate.now() + ": Gold star!\n");
}

final 类和方法

阻止继承:final 类和方法。

有时候,可能希望阻止人们利用某个类定义子类。不允许扩展的类被称为 final 类。如果在定义类的时候使用了 final 修饰符就表明这个类是 final 类。如果将一个类声明为 final,其中的所有方法自动地成为 final,而不包括数据域(final 类的数据域不会自动地成为 final 域)。

例如,假设希望阻止人们定义 Executive 类的子类,就可以在定义 Executive 这个类的时候,使用 final 修饰符声明。声明格式如下所示:

public final class Executive extends Manager {}

类中的特定方法也可以被声明为 final。如果这样做,子类就不能覆盖这个方法例如:

public class Employee {
   public final String getName() {
       return name;
   } 
}

将方法或类声明为 final 主要目的是:确保它们不会在子类中改变语义。例如:

  • Calendar 类中的 getTime() 和 setTime() 方法都声明为 final。这表明 Calendar 类的设计者负责实现 Date 类与日历状态之间的转换,而不允许子类处理这些问题。
  • 同样地,String 类也是 final 类,这意味着不允许任何人定义 String 的子类。换言之,如果有一个 String 的引用,它引用的一定是一个 String 对象,而不可能是其他类的对象。

有些程序员认为:除非有足够的理由使用多态性,应该将所有的方法都声明为 final。事实上,在 C++ 和 C# 中,如果没有特别地说明,所有的方法都不具有多态性。这两种做法可能都有些偏激。我们提倡在设计类层次时,仔细地思考应该将哪些方法和类声明为 final。

参考资料

《Java核心技术卷一:基础知识》(第10版)第 4 章:对象与类 4.3.9 final 实例域

《Java核心技术卷一:基础知识》(第10版)第 5 章:继承 5.1.7 阻止继承:final 类和方法

标签:Java,String,子类,修饰符,实例,方法,final
From: https://www.cnblogs.com/feiyu2/p/17349338.html

相关文章

  • javaIO之随机读写
    javaIO包提供了很多可以读写文件的类,但是如果想在文件的指定位置读写,就需要使用RandomAccessFilepublicclassApp{publicstaticvoidmain(String[]args)throwsIOException{{Strings1="ggg\n";Strings2="ggg,hhh\n";......
  • java中排序的正确用法
    publicclassTest{publicstaticvoidmain(String[]args){sort();}publicstaticvoidsort(){List<Integer>list=newArrayList();//降序hitRule.sort((o1,o2)->o2.compareTo(o1));//升序......
  • JAVA学习笔记随记1(类与对象)
    首先说明,这是为了学习java而做的笔记,所以记起来可能杂乱无章,无所谓了,刚开始学习都是这样的。。。首先小结下String的知识点String可以直接声明并赋初值并可以修改,例如:Stringabc="a";abc="b";其次字符串之间的连接用'+',只要出现字符串和其他数据类型之间用'+'连接,那么该......
  • java token自定义实现
    importcom.example.newsmanager.model.Token;importjavax.servlet.http.Cookie;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;publicclassTokenUtil{publicstaticfinalStringTOKEN_NAME="token&......
  • JavaScript 实现伽马算法
    伽马函数是数学中的一个非常重要的函数,它在统计学、物理学等领域有广泛的应用,其中最重要的应用就在概率统计和计算机科学中。接下来,我们来介绍如何使用JavaScript实现伽马算法。递归实现functiongamma(x){if(x===1){return1;}else{return(x-1)......
  • JAVA流程控制
    Java流程控制一、Scanner对象next():一定要读取到有效字符后才可以结束输入对输入有效字符之前遇到的空白,next()方法会自动将其去掉只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符next()不能得到带有空格的字符串nextLine():以Enter为结束符也就是说ne......
  • 前端进化笔记-JavaScript(一)
    简介:实现:三部分ecmascript语言核心DOM文档对象模型BOM浏览器对象模型DOM:用于html的应用程序接口(API),把整个页面映射成一个多层节点结构。例如:<html> <head> <title>samplepage</title> </head> <body> <p>helloworld</p> </body></html>DOM......
  • Java-Day-15( 异常 )
    Java-Day-15异常引出异常(Exception)如:零成分母时,会抛出ArithmeticException异常,然后程序就会崩溃退出,下面的代码也就不执行了但这种不出现致命错误就使得系统崩溃就不合理了所以设计者提供了异常处理机制来解决此问题解决方式—异常捕获如果程序员认为一段......
  • JavaScript 基础问答
      JavaScript数据类型有哪几种?  一共有五种:number、string、object、boolean、undefined.其中最后一个是定义变量后没有赋值介绍隐式类型转换字符串+数字=字符串;字符串-数字=数字;+数字字符串=数字null经过数字转换之后会变为0undefined经过数字转换之后会变为NaN......
  • 设计模式-原型模式-Java中使用示例-节日发送邮件活动
    场景设计模式-原型模式-浅克隆和深克隆在Java中的使用示例:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/127576328上面初步记录了原型模式的使用示例,下面再记录一个银行节假日或者搞活动时发送邮件的例子。原型模式原型模式(PrototypePattern)的简单程度仅次......