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

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

时间:2024-01-24 09:04:24浏览次数:32  
标签:面试官 Java String finalize System public finally 修饰 final

写在开头

面试官:“小伙子,用过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("我会跑");
    }
}

final修饰类

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

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

【代码示例】

public class Test extends Animal{

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

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() 。

标签:面试官,Java,String,finalize,System,public,finally,修饰,final
From: https://www.cnblogs.com/JavaBuild/p/17983808

相关文章

  • [Java]泛型
    【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)https://www.cnblogs.com/cnb-yuchen/p/17983795出自【进步*于辰的博客】启发博文:《java泛型详解-绝对是对泛型方法讲解最详细的,没有之一》(转发)。参考笔记三,P21.1、P42.1。注:引用启发博文中的两个概念:“类型......
  • 说说Java的AbstractQueuedSynchronizer
    Java中的Lock锁,都是基于AQS,也就是AbstractQueuedSynchronizer。那么AbstractQueuedSynchronizer又是基于什么原理来做锁的呢?一:锁原理1. 怎么算获取到了锁?AQS内置了一个volatileintstate字段,利用CAS保证并发安全,当state=0表示没没有线程占用。只要线程设置了state(比如置为1,......
  • Java流程控制
    Java流程控制1、用户交互Scanner之前我们学的基本语法中我们并没有实现程序和人的交互,但是Java给我们提供了这样一个工具类,我们可以获取用户的输入。java.util.Scanner是Java5的新特性,我们可以通过Scanner类来获取用户的输入。基本语法Scanners=newScanner(System.in)......
  • Java运行时数据区域
    运行时数据区域程序计数器(ProgramCounterRegister)当前线程所执行的字节码行号指示器(逻辑)通过改变计数器的值来选取下一条需要执行的字节码指令和线程一对一的关系,即“线程私有”对Java方法计数,如果是Native方法则计数器值为Undefined只是计数,不会发生内存泄漏J......
  • JAVA键盘输入语句
    介绍步骤案例点击查看代码importjava.util.Scanner;//表示把java.util下的Scanner类导入publicclassInput{//类名要与文件名一致//编写一个main方法publicstaticvoidmain(String[]args){ //演示接受用户的输入 //步骤 //Scanner类表示简单文本扫描......
  • 《Java核心编程》PDF
    内容简介本书主要基于Java13来介绍Java核心编程相关的知识点,以及从Java8至Java13以来的新特性,主要内容包括:Java语言基础、面向对象编程、集合框架、异常处理、I/O处理、网络编程、并发编程、基本编程结构的改进、垃圾回收器的增强、使用脚本语言、Lambda表达式与函数式编程、St......
  • 【APP逆向10】Java中常见加密与python实现
    1.隐藏字节,Stringv4=newString(newbyte[]{-26,-83,-90,-26,-78,-101,-23,-67,-112});byte_list=[-26,-83,-90,-26,-78,-101,-23,-67,-112]bs=bytearray()#python字节数组foriteminbyte_list:ifitem<0:item=item+256......
  • Java学习日记 Day9 今天小摆烂,明天加油~
    Spring框架:①IOC:简单说就是把创建对象的任务交给了配置文件,降低了代码耦合。②DI:IOC实现创建对象的任务后DI技术可以为在配置文件中为对象赋值。③代理模式:代替一个对象完成任务,分为静态代理和动态代理,动态代理有JDK和CGLIB两种,前者只可以对接口中的方法实现增强,而后者也可以对......
  • java基础面试知识点
    学习自javaGuideJava语言有哪些特点简单易学面向对象(封装,继承,多态)平台无关性(Java虚拟机实现平台无关性)支持多线程(C++语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,而Java语言却提供了多线程支持)可靠性(具备异常处理和自动内存管理......
  • 19_Java流程控制01-Scanner进阶使用
    Scanner进阶使用整数:hasNextInt()——nextInt()小数:hasNextFloat()——nextFloat()if:判断语句while:循环语句练习:循环输入,求和与平均数,回车确认,非数字结束指令并输出结果。Scannerscanner=newScanner(System.in);//开始doublesum=0;intm=0;System.out.println("请输......