Java进阶(2)——结合源码深入理解final关键字,修饰数据,软件测试高级面试题pdf

62 阅读4分钟

引出


1.在java源码中较多使用final修饰数据,比如ArrayList的初始长度;
2.final关键字修饰对象的引用的特点理解;
3.了解一下空白final,目前不知道有啥用途;
4.final修饰方法,比如java的万类之祖Object的getClass()方法;
5.final修饰类,不能被继承inherit,比如String类;

深入理解final关键字

在这里插入图片描述

经常背的答案:

  • 被 final 修饰的类不可以被继承
  • 被 final 修饰的方法不可以被重写
  • 被 final 修饰的变量不可以被改变.如果修饰引用,那么表示引用不可变,引用指向的内容可变.
  • 被 final 修饰的方法,JVM 会尝试将其内联,以提高运行效率,被 final 修饰的变量,在编译阶段会存入常量池中.

final:本质就是声明——这个东西不能变;

为啥不禁止变?——考虑设计,或者效率;

应用场景——数据(属性)、方法、类

final修饰数据

许多程序设计语言都有自己的办法告诉编译器某个数据是“常数”。常数主要应用于下述两个方面:
(1) 编译期常数,它永远不会改变
(2) 在运行期初始化的一个值,我们不希望它发生变化

static和final字段:只能存储一个数据,且不能改变;

对于基本数据类型,final会将值变成一个常数;

对于对象的引用,final会将对象的引用指向一个具体的对象,并且这个变量不能再指向另一个对象;然而被指向的对象本身是可以被修改的;因此,在这种情况下,引用不能变,引用指向的内容是可以变的;

基本数据类型

在这里插入图片描述

ArrayList的源码

在这里插入图片描述

两种方式对比

在这里插入图片描述

通常的写法:public static final int INT4 = 79;

public表示它们可在包外使用;Static 强调它们只有一个;而final 表明它是一个常数

对象的引用

将引用变成final 看起来似乎不如将基本数据类型变成final 那么有用

在这里插入图片描述

被 final 修饰的变量不可以被改变.如果修饰引用,那么表示引用不可变,引用指向的内容可变.

在这里插入图片描述

空白final

Java 1.1 允许我们创建“空白final”,它们属于一些特殊的字段。尽管被声明成final,但却未得到一个初始值。无论在哪种情况下,空白final 都必须在实际使用前得到正确的初始化。而且编译器会主动保证这一规定得以贯彻。然而,对于final 关键字的各种应用,空白final 具有最大的灵活性。举个例子来说,位于类内部的一个final 字段现在对每个对象都可以有所不同,同时依然保持其“不变”的本质。

现在强行要求我们对final 进行赋值处理——要么在定义字段时使用一个表达 式,要么在每个构建器中。这样就可以确保final 字段在使用前获得正确的初始化。

package com.tianju.redis.algorithm.finalD;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
class MyBlank {
    Integer id;
    String name;
}
@Data
public class BlankFinal {
    final int INT1 = 0;
    final int j; // 空白的final,必须赋值
    final MyBlank myBlank; // 空白final引用数据类型,必须赋值

    BlankFinal(int j, MyBlank myBlank) {
        this.j = j;
        this.myBlank = myBlank;
    }

    BlankFinal(int x){
        j =x;


![img](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/fc7168be5b3c40f7bbc9f23a60101a2c~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzIxMjA3NDIwNDUy:q75.awebp?rk3s=f64ab15b&x-expires=1770530841&x-signature=P05L3e6LuJktKpx4ovYfmqSQan0%3D)
![img](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/bcaca27d8c0041d199aa0910a1ad6c5a~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzIxMjA3NDIwNDUy:q75.awebp?rk3s=f64ab15b&x-expires=1770530841&x-signature=DMS1XsN2lTjAO8eJghCy2%2B3Iysk%3D)
![img](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/909a89c64f7a4e848e6ca9c8b130f804~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzIxMjA3NDIwNDUy:q75.awebp?rk3s=f64ab15b&x-expires=1770530841&x-signature=s%2BjeGaT4toK7IOTNfYbpBcQEa9I%3D)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!**

**开源项目:docs.qq.com/doc/DSlVlZExWQ0FRSE9H**