Java中的关键字很多,大约有50+,在日常开发中,自定义变量、类等不能和这些关键字存在冲突,每个关键字都代表着不同场景下的不同含义,以下为使用频率高、容易混淆的几个关键字。

1、static

static是静态的、全局的,一旦被修饰,说明被修饰的东西在一定范围内是共享的,谁都可以访问,这时候需要注意并发读写的问题。

1.1 修饰的对象

static只能修饰类变量、方法和方法块。

(1)static修饰类变量时,如果该变量是public的话,表示该变量任何类都可以直接访问,无需初始化类,直接使用“类名.static变量”的形式访问;

注:此时需要注意的一点是线程安全问题,因为当多个线程同时对共享变量进行读写时,很有可能会出现并发问题。例如,public static List<String> list = new ArrayList();这样的共享变量。这个list如果同时被多个线程访问的话,就有线程安全问题,一般解决方法为:

  1. 把线程不安全的ArrayList换成线程安全的CopyOnWriteArrayList;
  2. 每次访问时,手动加锁

所以在使用static修饰类变量时,如何保证线程安全是常常需要考虑的。

(2)static修饰方法时,代表该方法和当前类是无关的,任意类都可以直接访问(如果权限是public的话);

(3)static修饰方法块时,也称为静态块,静态块常常用于在类启动之前,初始化一些值:

public static List<String> list = new ArrayList();
// 进行一些初始化的工作
static {list.add("1");
}

以上代码演示了静态块做一些初始化的工作,静态块只能调用同样被static修饰的变量,并且static的变量需要写在静态块的前面,不然编译报错。

1.2初始化时机

以下代码演示了被static修饰的类变量、方法块和静态方法的初始化时机,具体如下:

public class Son extends Parent{public static List<String> SON_LIST = new ArrayList(){{System.out.println("Son 静态变量初始化");}};// 静态代码块static {System.out.println("Son 静态代码块");}public Son(){System.out.println("Son 构造方法");}public static void say(){System.out.println("Son静态方法");}public static void main(String[] args){new Son();new Son();}
}
class Parent{public static List<String> SON_LIST = new ArrayList(){{System.out.println("Parent 静态变量初始化");}};static {System.out.println("Parent 静态代码块");}public Parent(){System.out.println("Parent 构造方法");}public static void say(){System.out.println("Son静态方法");}
}

运行结果如下:

Parent 静态变量初始化
Parent 静态代码块
Son 静态变量初始化
Son 静态代码块
Parent 构造方法
Son 构造方法
Parent 构造方法
Son 构造方法

从执行结果,可以得出:

  • 父类的静态变量和静态块比子类优先初始化;
  • 静态变量和静态块比构造器优先初始化;
  • 静态代码块只运行一次,在第二次对象实例化时,不会运行;
  • 被static修饰的方法,在类初始化的时候并不会初始化,只有当自己被调用时,才会被执行。

2、final

final意思是不变的,一般来说用于以下几种场景:

1、被final修饰的类,表明该类是无法继承的;

2、被final修饰的方法,表明该方法是无法覆写的;

3、被final修饰的变量,说明该变量在声明的时候,必须初始化完成,而且以后也不能修改其内存地址

第三点需要注意,说的是无法修改其内存地址,并没有说无法修改其值。因为对于List、Map这些集合类来说,被final修饰后,是可以修改其内部值的,但无法修改其初始化时的内存地址。

3、try、catch、finally

捕捉异常的一整套流程:try用来确定代码执行的范围,catch捕捉可能发生的异常,finally用来执行一定要执行的代码块。除了这些,我们需要清除,每个地方如果发生异常会怎么办,演示示例如下:

@Slf4j
public class TryCatchFinally {public static void main(String[] args){try {log.info("try is running");if (true) {throw new RuntimeException("try Exception");}}catch (Exception e){log.info("catch is running");if (true) {throw new RuntimeException("catch Exception");}}finally {log.info("finally is running");}}
}

输出结果如下:

15:04:42.101 [main] INFO com.c503.poss.dm.Son - try is running
Exception in thread "main" java.lang.RuntimeException: catch Exception
15:04:42.103 [main] INFO com.c503.poss.dm.Son - catch is running
15:04:42.103 [main] INFO com.c503.poss.dm.Son - finally is runningat com.c503.poss.dm.Son.main(Son.java:22)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

从输出结果可知,以上代码的执行顺序为:try->catch->finally。

finally先执行后,再抛出catch的异常;

最终捕获的异常是catch的异常,try跑出来的异常已经被catch吃掉了。所以当遇见catch也有可能抛出异常时,可以先打印出try的异常,这样try的异常在日志中就会有所体现。

4、volatile

volatile的意思是可见的,常用来修饰某个共享变量,意思是当共享变量的值被修改后,会及时通知到其它线程上,其它线程就能知道当前共享变量的值已经被修改了。

5、transient

transient关键字常用来修饰类变量,意思是当前变量是无需进行序列化的。在序列化时,就会忽略该变量,这些序列化工具底层,就已经对transient进行了支持。

6、default

default关键字一般会用在接口的方法上,意思是对于该接口,子类是无需强制实现的,但自己必须有默认的实现,示例如下:

public interface DefaultInterface {/*** 获取所有用户的总数* @return*/Integer countUser();/*** 测试default关键字的使用场景*/default void testDefault(){System.out.println("test default");}
}public class DefaultInterfaceImpl implements DefaultInterface{@Overridepublic Integer countUser() {return null;}
}

DefaultInterfaceImpl 类中,并不需要强制性的实现接口中的testDefault方法。

3、Java常用关键字相关推荐

  1. 面试官系统精讲Java源码及大厂真题 - 03 Java 常用关键字理解

    03 Java 常用关键字理解 引导语 Java 中的关键字很多,大约有 50+,在命名上我们不能和这些关键字冲突的,编译会报错,每个关键字都代表着不同场景下的不同含义,接下来我们挑选 6 个比较重要 ...

  2. java关键字用于引用包,Java常用关键字总结

    常用关键字汇总图 详细解释 用于定义访问控制修饰符的关键字 控制范围图 public(公共的) 1.public 关键字是可以应用于类.方法或字段(在类中声明的变量)的访问控制修饰符. 2.可以在其他 ...

  3. JAVA常用关键字和英文缩写

    第一章: JDK(Java Development Kit) java开发工具包 JVM(Java Virtual Machine) java虚拟机 Javac 编译命令 java 解释运行命令 Ja ...

  4. appium java常用函数_AppiumLibrary常用关键字

    通过上一章节,open application关键字的使用,相信大家对手机自动化充满了兴趣,那么今天这一章节,主要介绍AppiumLibrary中常用关键字的使用. 一.实用函数 关键字 含义 实例 ...

  5. aide java 线程类_aide_Java常用关键字、方法使用实例

    aide_Java常用关键字.方法使用实例 1.== 与 equals ==: 基本类型:值相等 引用类型:地址相等(地址放在堆空间,注意常量池里的String值) equals: 运用于引用类型 在 ...

  6. java关键字的用法_JAVA常用关键字及其用法简要说明

    JA V A常用关键字及其用法简要说明Abstract抽象的一个Java语言中的关键字,用在类的声明中来指明一个类是不能被实例化的,但是可以被其它类继承.一个抽象类可以使用抽象方法,抽象方法不需要实现 ...

  7. Java 常用的基本关键字和常用单词

    Java 常用的基本关键字和常用单词 介绍 虽然经常与java打交道,但是一直没系统地对java这门语言进行整理和总结,掌握的知识也比较零散.恰好利用假期这段时间重新认识下java,并对一些常见单词进 ...

  8. Java中常用关键字总结(足以应对无聊面试官)

    1.常用关键字汇总 访问权限修饰符 Public default(并无该修饰符,默认啥也不写) protected private 异常处理关键词 try catch finallly throw t ...

  9. java 有哪些关键字_JAVA的常用关键字有哪些?

    JAVA的常用关键字有哪些? 发布时间:2020-05-25 21:46:00 来源:亿速云 阅读:133 作者:鸽子 下表是java中经常会用到的关键字: 一:用于定义访问权限修饰符的关键字: 1) ...

最新文章

  1. 怎么打断点_搞笑段子: 有次相亲, 双方父母都在, 我坐下就给自己点了支烟
  2. JS无法获取display为none的隐藏元素的宽度和高度的解决方案
  3. 前端月趋势榜:6 月新增的、最热门的 20 个前端开源项目 - 2106
  4. Think in Java第四版 读书笔记1
  5. 从王者荣耀看设计模式(二.单例模式)
  6. 【Cloud Foundry 应用开发大赛】“相助”专业问答系统
  7. 工业级Pass云平台SpringCloudAlibaba综合项目实战(一):序言
  8. 麻省理工学院公开课:计算机科学及编程导论
  9. 调出软键盘 挤掉标题栏咋办
  10. 荣耀9青春版能刷鸿蒙系统吗,华为荣耀9青春版刷机教程_荣耀9青春版强刷升级更新系统包...
  11. c语言中变量属性,C语言学习笔记--C语言中变量的属性关键字
  12. btrfs + snapper快照使用
  13. Keen Team: 这群执著的人和那些纯粹的事
  14. 苏宁618强势出圈,差异化竞争能力是杀手锏
  15. 什么是拼多多上货助手?拼多多上货助手有哪些功能?详细介绍
  16. 个人永久性免费-Excel催化剂功能第24波-批量发送邮件并指点不同附件不同变量...
  17. 机器学习 - SVD
  18. StringUtils字符串工具类
  19. 大学计算机实验实验报告,大学计算机实验3 实验报告.doc
  20. 网页服务器隐藏真实目录,Asp隐藏真实路径实现防盗链_方案总结篇 - YangJunwei

热门文章

  1. 都啥时候了,你还怕学了Python找不到工作?
  2. 万门69节入门python_Python入门六:字符串
  3. mysql 5.7 收费_MySQL5.7 常用用户操作
  4. oracle sql 平均分配 分组_SQL学习二
  5. Linux防止SSH暴力破解
  6. 看下Linux 如何查看端口占用情况
  7. kafka 主动消费_SpringBoot2 整合Kafka组件,应用案例和流程详解
  8. 【操作系统】进程 与 线程 详解(以及二者的比较)
  9. 怎么使用html及jsp开发,jsp怎么用css
  10. java连接pg_postgresql 入门(含java、scala连接代码)