面试官:小伙子来说一说Java中final关键字,以及它和finally、finalize()有什么区别?

简介: 面试官:“小伙子,用过final关键字吗?”我:“必须用过呀”面试官:“好,那来说一说你对这个关键字的理解吧,再说一说它与finally、finalize()的区别”我:“好嘞!

写在开头

面试官:“小伙子,用过final关键字吗?”
我:“必须用过呀”
面试官:“好,那来说一说你对这个关键字的理解吧,再说一说它与finally、finalize()的区别”
我:“好嘞!”

final中文释义:最终的,最后的;在Java中作为关键字的一种,被用来修饰变量、方法、类,final 语义是不可改变的。

final修饰变量

当final修饰变量时有如下几点需要注意:

1、final 修饰表示常量、一旦创建不可改变;
2、final 修饰的局部变量必须在声明时给定初值;
3、final 修饰的成员变量必须在声明时给定初值或者在构造方法内设置初始值,只能读取,不可修改;
4、被 final 修饰的成员变量必须要初始化,赋初值后不能再重新赋值(可以调用对象方法修改属性值)。
   对基本类型来说是其值不可变;对引用变量来说其引用不可变,即不能再指向其他的对象;

【代码示例】

public class Test {
   
   
    private String name;
    public final int age = 18;
    //和static一同修饰时,被当做常量
    private static final int HIGH = 180;

    public String getName() {
   
   
        return name;
    }
    public void setName(String name) {
   
   
        this.name = name;
    }
    public int getWeight(){
   
   
        final int weight;
        //修饰局部变量时,不能再赋值,需要在声明时给定初始值!
        return weight;
    }
    public static void main(String[] args) {
   
   
       final Test test = new Test();
       // 给一个被final修饰的引用类型重新赋值,编译器会报错,提示取消final修饰
       //test = new Test();
        // 但给这个引用类型进行属性赋值是可以的!
        test.setName("JavaBuild");
        //final修饰的成员变量,给定初始值后不可再修改,但可以调用
        if(test.age == 18){
   
   
            System.out.println("永远18岁");
        }
    }
}

final修饰方法

当final修饰方法时需要注意:

1、final修饰的方法:只能使用,不能被子类重写,但能够类内重载;

【代码示例】

public class Test extends Animal{
   
   
    //方法的重写不被允许
    public void run(){
   
       
    }
}
class Animal {
   
   
    public final void run(){
   
   
        System.out.println("我会跑");
    }
    //方法的重载,被允许
    public final void run(String dog){
   
   
        System.out.println("我会跑");
    }
}

image.png

final修饰类

当final修饰方法时需要注意:

1final修饰的类不能被继承,没有子类;
2final 类中的方法默认是 final 的,比如String类;

【代码示例】

public class Test extends Animal{
   
   

}
 final class Animal {
   
   
    public final void run(){
   
   
        System.out.println("我会跑");
    }
}

image.png

final、finally、finalize()三者的区别?

final

见上文

finally

finally 异常处理的一部分,它只能用在 try/catch 语句中,表示希望 finally 语句块中的代码最后一定被执行(存在一些情况导致 finally 语句块不会被执行,如 jvm 结束)
不被执行的情况:

  • 直接返回未执行到 try-finally 语句块
  • 抛出异常未执行到 try-finally 语句块
  • 系统退出未执行到 finally 语句块

【代码示例】

public static String test() {
   
   
    String str = null;
    int i = 0;
    if (i == 0) {
   
   
        return str;//直接返回未执行到finally语句块
    }
    try {
   
   
        System.out.println("try...");
        return str;
    } finally {
   
   
        System.out.println("finally...");
    }
}

public static String test2() {
   
   
    String str = null;
    int i = 0;
    i = i / 0;//抛出异常未执行到finally语句块
    try {
   
   
        System.out.println("try...");
        return str;
    } finally {
   
   
        System.out.println("finally...");
    }
}

public static String test3() {
   
   
    String str = null;
    try {
   
   
        System.out.println("try...");
        System.exit(0);//系统退出未执行到finally语句块
        return str;
    } finally {
   
   
        System.out.println("finally...");
    }
}

finalize()

finalize() 是在 java.lang.Object 里定义的,Object 的 finalize() 方法什么都不做,对象被回收时 finalize() 方法会被调用。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要清理工作,在垃圾收集器删除对象之前被调用的。
一般情况下,此方法由JVM调用。特殊情况下,可重写 finalize() 方法,当对象被回收的时候释放一些资源,须调用 super.finalize() 。

目录
相关文章
|
2月前
|
存储 缓存 安全
除了变量,final还能修饰哪些Java元素
在Java中,final关键字不仅可以修饰变量,还可以用于修饰类、方法和参数。修饰类时,该类不能被继承;修饰方法时,方法不能被重写;修饰参数时,参数在方法体内不能被修改。
36 2
|
7天前
|
安全 架构师 Java
Java大厂面试高频:Collection 和 Collections 到底咋回答?
Java中的`Collection`和`Collections`是两个容易混淆的概念。`Collection`是集合框架的根接口,定义了集合的基本操作方法,如添加、删除等;而`Collections`是一个工具类,提供了操作集合的静态方法,如排序、查找、同步化等。简单来说,`Collection`关注数据结构,`Collections`则提供功能增强。通过小王的面试经历,我们可以更好地理解这两者的区别及其在实际开发中的应用。希望这篇文章能帮助你掌握这个经典面试题。
25 4
|
7天前
|
监控 Dubbo Java
Java Dubbo 面试题
Java Dubbo相关基础面试题
|
7天前
|
SQL Java 数据库连接
Java MyBatis 面试题
Java MyBatis相关基础面试题
|
7天前
|
存储 监控 算法
Java JVM 面试题
Java JVM(虚拟机)相关基础面试题
|
7天前
|
SQL 监控 druid
Java Druid 面试题
Java Druid 连接池相关基础面试题
|
7天前
|
缓存 安全 算法
Java 多线程 面试题
Java 多线程 相关基础面试题
|
27天前
|
Java
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
今日分享的主题是如何区分&和&&的区别,提高自身面试的能力。主要分为以下四部分。 1、自我面试经历 2、&amp和&amp&amp的不同之处 3、&对&&的不同用回答逻辑解释 4、彩蛋
|
2月前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
91 14
|
2月前
|
Java 编译器 程序员
Java面试高频题:用最优解法算出2乘以8!
本文探讨了面试中一个看似简单的数学问题——如何高效计算2×8。从直接使用乘法、位运算优化、编译器优化、加法实现到大整数场景下的处理,全面解析了不同方法的原理和适用场景,帮助读者深入理解计算效率优化的重要性。
43 6