java基础篇 之 final关键字

简介: java基础篇 之 final关键字

final,字面上是最终的意思,通常来说,我们用它来作为修饰符的时候,都是代表“这是无法改变的”的意思。不想改变可能出与两种理由:设计或效率。由于这两个原因相差甚远,所以我们在使用final关键字的时候很容易误用。


主要从三个方面来讲


  1. final修饰变量
  2. final修饰方法
  3. final修饰类


final修饰变量


  • 修饰基本数据类型


当我们使用final修饰基本数据类型时,代表我们申明了一个编译时的常量,编译器会在编译时就将其代入到表达式中进行计算,减少了一些我们在运行时的负担


  • 修饰引用数据类型


当我们使用final修饰引用数据类型时,代表了这个引用不能再被指向其它对象,但是对象自身是可变的。对于初学者来说,这一点总是让人感觉到迷惑,举个例子:我们新建一个对象final Person p = new Person(),当我们申明后,p只能指向我们new的这个person对象,我们不能将p再指向一个新new出来的对象,但是对于p所指向的person对象来说,这个对象是可变的,假设这个person类中存在属性age并存在对应的getter,setter方法,我们还是可以调用p.setAge(xxx),来改变这个对象的属性


  • 一个既是static又是final的域只占据一段不能改变的存储空间。我相信理解了上面亮点,这一点也不难理解。static修饰的属性,随着类的加载而加载,final修饰的数据,“不可改变”。这就代表着当类加载完后,对象还未创建时,我们就已经申明了一段”不可改变“的存储空间


  • 空白final。我们看下面这段代码:
public class Person{
    private int age;
    private final String name;
    public Person(String name){
        this.name = name;
    }
}

我们可以看到,在声明final类型的name属性时,我们并没有对其进行初始化,但是编译也通过了,这是为什么呢?其实就是因为我们在Person类唯一的构造函数中完成了对final修饰的属性的初始化。同时这也意味着,如果我们在声明的时候,采用了空白final的方式,那么在所有的构造函数中我们都要对这个属性进行初始化。这也不难理解,我们申明了一个非静态的空白final属性,非静态,代表我们声明这个属性是为了给这个类的对象使用,final代表了这个对象中有一个不可变的属性,且这个属性必须在对象创建的时候就完成初始化。这样分析下来,只能是在构造函数的时候对这个属性进行初始化,为了保证所有的对象都是正常的,那么所有构造函数都必须完成对这个属性初始化的任务。


final修饰方法


  • 我们在使用final修饰方法时,唯一目的就是将方法锁定,防止被子类复写,这是出与设计的目的。
  • private与final。


首先来说,所有private的方法都会被隐式的指定为final,我们对一个private的方法采用final修饰符进行修饰是没有意义的。private的方法本身就无法被复写。这一点大家可以通过@Override注解去验证,我就不多解释了


final修饰类


我们在使用final修饰类时,代表了这个类不能被继承。由于final类禁止继承,所以final类中所有的方法都隐式指定为final的,因为无法覆盖它们。在final类中可以给方法添加final关键字,但这不会增添任何意义。


相关文章
|
10天前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
38 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
5天前
|
Java 程序员
Java 面试高频考点:static 和 final 深度剖析
本文介绍了 Java 中的 `static` 和 `final` 关键字。`static` 修饰的属性和方法属于类而非对象,所有实例共享;`final` 用于变量、方法和类,确保其不可修改或继承。两者结合可用于定义常量。文章通过具体示例详细解析了它们的用法和应用场景。
18 3
|
3天前
|
存储 安全 Java
了解final关键字在Java并发编程领域的作用吗?
在Java并发编程中,`final`关键字不仅用于修饰变量、方法和类,还在多线程环境中确保对象状态的可见性和不变性。本文深入探讨了`final`关键字的作用,特别是其在final域重排序规则中的应用,以及如何防止对象的“部分创建”问题,确保线程安全。通过具体示例,文章详细解析了final域的写入和读取操作的重排序规则,以及这些规则在不同处理器上的实现差异。
了解final关键字在Java并发编程领域的作用吗?
|
12天前
|
Java 编译器
在Java中,关于final、static关键字与方法的重写和继承【易错点】
在Java中,关于final、static关键字与方法的重写和继承【易错点】
19 5
|
18天前
|
缓存 安全 Java
Java中 final、finally、finalize 有什么区别?
本文详细阐述了Java中`final`、`finally`和`finalize`的区别:`final`用于修饰类、方法和变量以表示不可变性;`finally`是用于确保在`try-catch`结构中无论是否发生异常都能执行的代码块;而`finalize`是`Object`类的方法,用于在对象被垃圾回收前执行清理工作,但在JDK 9中已被标记为弃用。
14 0
Java中 final、finally、finalize 有什么区别?
|
18天前
|
Java
Java关键字 —— static 与 final 详细解释!一看就懂 有代码实例运行!
这篇文章详细解释了Java中static和final关键字的用法,包括它们修饰类、方法、变量和代码块时的行为,并通过代码示例展示了它们的具体应用。
68 0
Java关键字 —— static 与 final 详细解释!一看就懂 有代码实例运行!
|
1月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
16天前
|
存储 安全 Java
了解final关键字在Java并发编程领域的作用吗?
了解final关键字在Java并发编程领域的作用吗?
|
17天前
|
Java 程序员 编译器
【Java】继承、super、final、子类构造方法
【Java】继承、super、final、子类构造方法
18 0
|
18天前
|
安全 Java 编译器
了解final关键字在Java并发编程领域的作用吗?
【10月更文挑战第8天】在Java并发编程中,`final`关键字具有重要作用,包括保证变量的可见性和不可变性,防止对象引用被意外修改,并帮助编译器优化读取操作及消除不必要的同步。通过确保变量不可变,`final`增强了多线程环境下的安全性与性能。