Java关键字解析——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等关键字,这将在后面的多线程、高并发中讲到。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容

  • 既已,齐人徐巿等上书,言海中有三神山,名曰蓬莱、方丈、瀛洲,仙人居之。请得斋戒,与童男女求之。於是遣徐巿发童男女数...
    小苏书九州阅读 357评论 2 2
  • 大家好,我是水日京子,要是问我为什么是这个名字的话,这个由来于我侄子的名字哈哈,好了今天呢,我想和大家分享一篇周末...
    水日京子阅读 356评论 1 3
  • 我在去年5月中旬跳槽到一家本地知名投行公司,在这之前我在政府部门工作,从事留学生的创业辅导及申报工作。我想聊聊我进...
    JulienYu阅读 859评论 3 2
  • 1993年10月,在湖北省荆门市郭店村,中国考古学界有一个重大的发现,在郭店一号楚墓发掘出竹简804枚,其中有字的...
    北池鱼阅读 3,107评论 18 21
  • 在做阅读理解的时候 会被干扰选项带偏 忘记了原本的方向 于是就错了 人在前行的路上 也会被身边的人、事、环境而干扰...
    朵猫Nicole阅读 474评论 0 0