Java关键字解析——深入Java基础系列(四)

前言

本文是深入Java基础系列的第四篇,关于文集介绍可通过<<Java基础回炉暨系列开篇>>进行了解。

这篇文章将整理Java中常见的关键字,通过将形似的关键字进行比较和区分,旨在让大家底掌握常见Java关键字的用法和使用时的注意事项。


1. final、finally、finalize

final、finally、finalize有什么不同? 这个问题在面试的时候经常被问到,因为它们三个长得有点像,但是用途却完全不同。那你知道它们的区别吗?

1.1 final

(1)final可以用来修饰变量、方法、类,分别有不同的意义:

  • final关键字修饰一个基本类型的变量时,在定义的时候就需要进行初始化,该变量不能重新赋值,第一次的值即为最终的。
  • fianl关键字修饰一个引用类型变量时,该变量不能重新指向新的对象。(final只能约束这个引用不可以被赋值,但是该引用指向的对象的行为不被final影响,这与immutable不同)
// final只能约束strList这个引用不可以被赋值,
//但是strList对象的行为并不受final的影响
 final List<String> strList = new ArrayList<>();
 strList.add("Hello");
 strList.add("world");  
 
 //List.of方法创建的本身就是不可变List,最后一句add是会在运行时抛出异常的
 List<String> unmodifiableStrList = List.of("hello", "world");
 unmodifiableStrList.add("again");
  • final关键字修饰一个方法的时候,该方法不能被重写。(主要用于将方法锁定,防止子类修改。)
  • final关键字修饰一个类的时候,该类不能被继承。(当需要一个完全封装、无法改变的类时,可以使用final修饰增强安全性。)

(2)为什么局部内部类(包括匿名内部类)访问了局部函数的形参,该变量需要使用final修饰?
这个问题在 深入类和对象——深入Java基础系列(二)中已经讲过,这里就不再重复。

1.2 finally

(1)finally是异常体系中的关键字,保证重点代码一定要被执行的一种机制。

我们可以使用try-finally或者try-catch-finally,在finally代码块中进行类似关闭JDBC连接、保证unlock锁等动作。在使用的时候应该注意:

  • finally块的使用前提是必须要存在try块才能使用。(成对出现)
  • finally块的代码在任何情况下都会执行的,除了jvm退出的情况。
// 这里程序在try块中已经退出来了,所以finally里面的代码并不会执行
try {
  // do something
  System.exit(1);
} finally{
  System.out.println(“Print from finally);
}
  • finally非常适合做资源释放的工作,这样子可以保证资源文件在任何情况下都会被释放。

(2)当try和catch中有return时,finally中的代码能执行吗?
答案是能的,这里验证一下:

public class FinallyTest {
    public static void main(String[] args) {
        int n=test();
        System.out.println(n);
    }
    public static int test() {
        int m;
        try {
            m = 3;
            return m+1;
        } finally {
            m=8;
            System.out.println("Print from finally");
        }
    }
}
// output:
	Print from finally
	4

这里要清楚一点,finally代码块是在return关键字后面的代码执行完后再执行的,此时还没有出函数体,程序先将要返回的值保存起来,即使在finally代码块中修改m的值都不影响最终的返回值。

但是,我们最好不要在finally块中包含return,否则程序的返回值就不是trycatch中的原始保存的返回值了。

public class  FinallyTest {
    public static void main(String[] args) {
        int n=test();
        System.out.println(n);
    }
    public static int test() {
        int m;
        try {
            m = 3;
            return m+1;
        } finally {
            m=8;
            System.out.println("Print from finally");
            return m;
        }
    }
}
// output:
	Print from finally
	8

关于finally关键字,我们只要明确知道怎么使用就足够了。

1.3 finalize

在介绍finalize之前,得说明它是不推荐使用的,在Java 9中已经将它标记为deprecated,也就是不推荐使用的。

其实,finalize是java基础类java.lang.Object中的一个方法:

protected void finalize() throws Throwable { }

它的设计目的是保证对象在被垃圾收集前完成特定资源的回收,但是finalize()能做的所有工作,使用try-finally或者其他的方式都可以做得更好、更及时。

2. static

(1)static 表示静态,它可以修饰属性,方法和代码块。

  • static修饰的变量即为静态变量,当JVM加载类后,可以通过类名直接访问,**类的所有实例共享一个static变量。(不光创建多少个对象,静态属性在内存中只有一个)**在<<深入类和对象>>中提到:在类的生命周期的连接阶段的准备过程中,JVM会为类的静态变量分配内存并设为jvm默认的初值,所以静态变量是对象创建之前就存在的。static不能修饰局部变量。
  • static修饰的方法即为静态方法, 静态方法可以直接通过类名调用,但是不能直接访问所属类的实例变量和方法,只能访问所属类的静态变量和方法,这是因为实例成员只与特定对象关联。静态方法不能被重写。
  • static还可以修饰代码块,它是类中独立于类成员的static语句块,不在任何方法体内,当JVM加载类时,就会执行静态代码块,无需等待实例化,static语句块可以多个,JVM会按照它们的先后顺序依次执行。静态代码块是在类的生命周期的初始化阶段执行的,详细过程请看<<深入类和对象>>

(2)static和final一起使用有什么作用?

  • static和final修饰的变量可看做“全局变量”,在类加载在类的生命周期的连接阶段的准备过程中,JVM会为类的静态常量分配内存并设为程序员赋予的初始值。
  • static和final修饰的方法,不能被继承,可以通过类名直接调用。

3. this和super

3.1 this

(1)this关键字指向:

this关键字代表了this所属函数的调用者对象,这句话的意思是,this在某个方法的内部,若这个方法被一个对象调用,那么this就指向这个对象。

(2)this关键字的作用:

  • 如果存在同名成员变量局部变量时,在方法内部默认是访问局部变量的数据(就近原则),可以通过this关键字指定访问成员变量的数据。
    • 如果在方法中访问了成员变量,java编译器会在该变量的前面加上this关键字。
  • 在一个构造函数中可以调用另外一个构造函数初始化对象。需注意:
    • == this关键字调用其他的构造函数时,this关键字必须要位于构造函数中的第一个语句。==
    • 如果在一个方法中访问了一个变量,该变量只存在成员变量的情况下,那么java编译器会在该变量的前面添加this关键字。

3.2 super

(1)super 关键字的指向:
super关键字代表的是父类的引用空间

(2)super关键字的作用:

  • 如果子父类存在同名的成员时,在子类中默认是访问子类的成员,可以通过super关键字指定访问父类的成员。
  • 创建子类对象时,默认会先调用父类的无参构造函数,可以通过super关键字指定调用父类的构造函数。需注意:
    • 如果在子类 的构造函数中没有指定调用具体父类构造函数,那么java编译器会在子类的构造函数上添加super()语句。
    • super关键字调用构造函数时必须出现构造函数中第一个语句。

4. 总结

本文就 final、finally、finalizestaticthis、super三组关键字进行分析,让大家清楚每组关键字中的差别和用法,以及使用的时候的注意事项。当然Java中还有许多的关键字,例如synchronizedvolatile等关键字,这将在后面的多线程、高并发中讲到。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值