【面试1v1实景模拟】面试中常见的Java关键字详解

news2025/6/30 4:59:03

在这里插入图片描述

笑小枫专属目录

      • 老面👴:Java中有哪些关键字
      • 老面👴:简单介绍一下 final 关键字
      • 老面👴:简单介绍一下 this、super 关键字
      • 老面👴:简单介绍一下 static 关键字
      • 老面👴:简单介绍一下 volatile 关键字
      • 老面👴:简单介绍一下 synchronized 关键字
      • 老面👴:简单介绍一下 break、continue 关键字
      • 老面👴:简单介绍一下 trabsient 关键字
      • 老面👴:简单介绍一下 instanceof 关键字
      • 老面👴:简单介绍一下 extends、implements 关键字
      • 老面👴:简单介绍一下 native 关键字

老面👴:Java中有哪些关键字

笑小枫🍁:

  1. 用于数据类型
    用于数据类型的关键字有 boolean、byte、char、 double、 float、int、long、new、short、void、instanceof。

  2. 用于语句
    用于语句的关键字有break、case、 catch、 continue、 default 、do、 else、 for、 if、return、switch、try、 while、 finally、 throw、this、 super。

  3. 用于修饰
    用于修饰的关键字有 abstract、final、native、private、 protected、public、static、synchronized、
    transient、 volatile。

  4. 用于方法、类、接口、包和异常
    用于方法、类、接口、包和异常的关键字有 class、 extends、 implements、interface、 package、import、throws。

  5. 其他
    还有些关键字,如 future、 generic、 operator、 outer、rest、var等都是Java保留的没有意义的关键字。另外,Java还有3个保留字:goto、const、null。它们不是关键字,而是文字。包含Java定义的值。和关键字一样,它们也不可以作为标识符使用。


老面👴:简单介绍一下 final 关键字

笑小枫🍁:final关键字可以用来修饰引用、方法和类。

  1. 修饰引用
  • 如果引用为基本数据类型,则该引用为常量,该值无法修改;
  • 如果引用为引用数据类型,比如对象、数组,则该对象、数组本身可以修改,但指向该对象或数组的地址的引用不能修改。
  • 如果引用时类的成员变量,则必须当场赋值,否则编译会报错。
  1. 修饰方法
    当使用final修饰方法时,这个方法无法被子类重写。但是,该方法仍然可以被继承。

  2. 修饰类
    当用final修改类时,该类成为最终类,无法被继承。


老面👴:简单介绍一下 this、super 关键字

笑小枫🍁:this:代表当前对象的引用,谁来调用我我就代表谁。super:代表当前对象对父类的引用。

  1. 调用成员变量不同;
    this:成员变量 调用本类的成员变量,也可以调用父类的成员变量。
    super:成员变量 调用父类的成员变量。

  2. 调用构造方法不同。
    this:调用本类的构造方法。
    super:调用父类的构造方法。

  3. 调用成员方法。
    this:成员方法 调用本类的成员方法,也可以调用父类的方法。
    super:成员方法 调用父类的成员方法。


老面👴:简单介绍一下 static 关键字

笑小枫🍁:

  1. static是一个修饰符,用于修饰成员。(成员变量,成员函数)static修饰的成员变量 称之为静态变量或类变量。
  2. static修饰的成员被所有的对象共享。
  3. static优先于对象存在,因为static的成员随着类的加载就已经存在。
  4. static修饰的成员多了一种调用方式,可以直接被类名所调用,(类名.静态成员)。
  5. static修饰的数据是共享数据,对象中的存储的是特有的数据。

老面👴:简单介绍一下 volatile 关键字

笑小枫🍁:volatile是java虚拟机提供的轻量级同步机制,用于表示可以被多个线程异步修改的成员变量,其特点有: 1.保证可见性 2.禁止指令重排 3.不保证原子性

1、volatile可见性实现原理:

变量被volatile关键字修饰后,底层汇编指令中会出现一个lock前缀指令。会导致以下两种事情的发生:

  1. 修改volatile变量时,会强制将修改后的值刷新到主内存中。
  2. 修改volatile变量后,会导致其他线程工作内存中对应的变量值失效。因此,再读取该变量值的时候就需要重新从读取主内存中的值。

2、volatile有序性实现原理:

**指令重排序:**编译器在不改变单线程程序语义的前提下,重新安排语句的执行顺序,指令重排序在单线程下不会有问题,但是在多线程下,可能会出现问题。

volatile有序性的保证就是通过禁止指令重排序来实现的。指令重排序包括编译器和处理器重排序,JMM会分别限制这两种指令重排序。禁止指令重排序又是通过加内存屏障实现的。

JMM:JMM(java 内存模型 Java Memory Model 简称JMM) 本身是一个抽象的概念,并不在内存中真实存在的,它描述的是一组规范或者规则,通过这组规范定义了程序中各个变量(实例字段,静态字段和构成数组对象的元素)的访问方式.
JMM的同步规定:
 1.线程解锁之前,必须把共享变量刷新回主存
 2.线程加锁锁之前,必须读取主存的最新值到自己的工作空间
 3.加锁解锁必须是 同一把锁

内存屏障(memory barriers):一组处理器指令,用于实现对内存操作的顺序限制。

img

3、 volatile为什么不保证原子性?

java中只有对变量的赋值和读取是原子性的,其他的操作都不是原子性的。所以即使volatile即使能保证被修饰的变量具有可见性,但是不能保证原子性。


老面👴:简单介绍一下 synchronized 关键字

笑小枫🍁:可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。

在早期的java版本,synchronized 关键字属于重量级锁,效率低下。jdk1.6之后有了优化。

synchronized在java内存模型中主要有3种作用,分别是:

  • 原子性:通过monitorenter和monitorexit指令,保证被synchronized修饰的代码在同一时间只能被一个线程访问,在锁未释放之前,无法被其他线程访问到
  • 可见性:保证共享变量的修改能够及时可见,对一个变量的unlock操作之前,必须把此变量同步回主内存中(store和write操作)
  • 有序性:一个变量在同一时刻只允许一条线程对其执行lock操作,这条规则决定了持有同一个锁的两个同步块只能串行执行

synchronized的底层实现原理

  • 原子性实现原理
    synchronized实现原子性底层是通过JVM来实现的,同一时间只能有一个线程去执行synchronized中的代码块;
    每一个对象都有一个监视器monitor来关联,监视器被占用时会被锁住,其他线程无法获取该monitor,当JVM执行某个线程的的内部方法的monitorenter,它会尝试去获取该对象的monitor的所有权,过程如下:
  1. 若monitor的进入数为0,线程可以进入monitor,并将该monitor的进入数置为1,那么该线程就成为monitor的所有者
  2. 若线程已拥有monitor的所有权,允许它重入monitor,则进入monitor的进入数加1(recursions:记录线程拥有锁的次数)
  3. 若其他线程已经占有monitor的所有权,那么当前尝试获取monitor的所有权的线程会被阻塞,直到monitor的进入数变为0,才能重新尝试获取monitor的所有权。

monitorexit指令

  1. 能执行monitorexit指令的线程一定是拥有当前对象的monitor的所有权的线程。
  2. 当执行monitorexit时会将monitor的进入数减1。当monitor的进入数减为0时,当前线程退出monitor,不再拥有monitor的所有权,此时这个monitor阻塞的线程可以尝试去获取这个monitor的所有权。
  • 可见性实现原理
    synchronized通过内存屏障保证可见性,同样的我们知道volatile是通过内存屏障来保证可见性的,
  1. monitorenter指令之后,synchronized内部的共享变量,每次读取数据的时候被强制从主内存读取最新的数据。
  2. monitorexit指令也具有Store屏障的作用,也就是让synchronized代码块内的共享变量,如果数据有变更的,强制刷新回主内存。
    数据修改之后立即刷新回主内存,其他线程进入synchronized代码块后,使用共享变量的时候强制读取主内存的数据。
  • 有序性实现原理
    同样的,synchronized也是通过monitorenter、monitorexit指令嵌入上面的内存屏障,既具有加锁、释放锁的功能,同时也具有内存屏障的功能

老面👴:简单介绍一下 break、continue 关键字

笑小枫🍁:

break用于完全结束一个循环,跳出循环体,执行循环后面的语句。

continue是跳过当次循环中剩下的语句,执行下一次循环。


老面👴:简单介绍一下 trabsient 关键字

笑小枫🍁:被transient修饰的变量不参与序列化和反序列化。当一个对象被序列化的时候,transient型变量的值不包括在序列化的表示中,然而非transient型的变量是被包括进去的。


老面👴:简单介绍一下 instanceof 关键字

笑小枫🍁:在 Java 中可以使用 instanceof 关键字判断一个对象是否为一个类(或接口、抽象类、父类)的实例


老面👴:简单介绍一下 extends、implements 关键字

笑小枫🍁:

extends 是继承某个类, 继承之后可以使用父类的方法, 也可以重写父类的方法

implements 是实现多个接口, 接口的方法一般为空的, 必须实现才能使用


老面👴:简单介绍一下 native 关键字

笑小枫🍁:native主要用于方法上,native方法是指该方法的实现由非Java语言实现,比如用C或C++实现。

主要是因为JAVA无法对操作系统底层进行操作,但是可以通过jni(java native interface)调用其他语言来实现底层的访问。

PS:JNI是Java本机接口(Java Native Interface),是一个本机编程接口,它是Java软件开发工具箱(java Software Development Kit,SDK)的一部分。JNI允许Java代码使用以其他语言编写的代码和代码库。Invocation API(JNI的一部分)可以用来将Java虚拟机(JVM)嵌入到本机应用程序中,从而允许程序员从本机代码内部调用Java代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/397193.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度解析Spring Boot自动装配原理

废话不多说了,直接来看源码。源码解析SpringBootApplication我们在使用idea创建好Spring Boot项目时,会发现在启动类上添加了SpringBootApplication注解,这个注解就是Spring Boot的核心所在。点击注解可以查看到到它的实现ementType.TYPE) Re…

JavaScript简单记录

简介 JavaScript 诞生于 1995 年。JavaScript 使得现代网页应用程序成为可能,使用 JavaScript 可以直接与用户交互,从而避免每一个动作都需要重新载入页 面。但有许多传统网站也会使用 JavaScript 来提供实时交互以及更加智能的表单功能。 JavaScript 其实和名为Ja…

【PaddlePaddle onnx】PaddlePaddle导出ONNX及模型可视化教程

文章目录1 背景介绍2 实验环境3 paddle.onnx.export函数简介4 代码实操4.1 PaddlePaddle与ONNX模型导出4.2 ONNX正确性验证4.3 PaddlePaddle与ONNX的一致性检查4.4 多输入的情况5 ONNX模型可视化6 ir_version和opset_version修改7 致谢原文来自于地平线开发者社区,未…

HBase高手之路1-Hbase简介

文章目录HBase高手之路1-Hbase简介一、什么是HBase1. HBase简介2. HBase的发展过程二、HBase特点1. 海量存储2. 列式存储3. 极易扩展4. 高并发5. 稀疏6. 强一致性读/写7. 自动分块8. 自动RegionServer故障转移9. Hadoop/HDFS集成10. MapReduce11. Java Client API12. Thrift/RE…

大聪明教你学Java | 带你了解 Redis 的三种集群模式

前言 🍊作者简介: 不肯过江东丶,一个来自二线城市的程序员,致力于用“猥琐”办法解决繁琐问题,让复杂的问题变得通俗易懂。 🍊支持作者: 点赞👍、关注💖、留言&#x1f4…

STM32 OTA应用开发——通过串口/RS485实现OTA升级(方式1)

STM32 OTA应用开发——通过串口/RS485实现OTA升级(方式1) 目录STM32 OTA应用开发——通过串口/RS485实现OTA升级(方式1)前言1 环境搭建2 功能描述3 程序编写3.1 BootLoader部分3.2 APP的制作4 修改工程中的内存配置4.1 Bootloader…

uniapp生命周期

uniapp生命周期 uniapp生命周期不同于vue生命周期,uniapp生命周期分为: 应用生命周期 页面生命周期 组件生命周期 应用生命周期(官网) 注意 应用生命周期仅可在App.vue中监听,在其它页面监听无效。 onlaunch里进行页面跳转,如遇白…

你还在使用if-else写代码吗,今天带你领略下策略模式的魅力!

1、什么是策略模式 策略模式其实也是在解耦,把策略的定义、创建、使用这三个部分解耦开来,因为本身策略模式也是基于接口编程,这样其实可以简单的理解客户端调用使用接口进行编程,可以通过工厂方法创建对应的策略模式&#xff0c…

Docker 常见操作及部署springboot、Shiro、SpringData脚手架(下)

1、查找jdk容器 docker search jdk 2、查看镜像 docker images 3、启动JDK镜像 docker run -di --namejdk1.8 clarinpl/java 4、查看镜像运行情况 docker ps 5、使用命令行进入容器 docker exec -it 48428f21b6ee /bin/bash 6、查看jdk版本 java -version 7、从宿主机复制…

面向对象 - 继承

Hello , 各位同学朋友大家好啊, 今天给大家分享的技术呢, 是面向对象三大特征之一的继承,我们今天主要按照以下几个点, 展开继承的讲解。目录 :* 继承的介绍* 继承的好处和弊端* 继承中成员访问特点 - 成员变量* 继承中成员访问特点 - 成员方法* 方法重写* 继承中成…

一文认知并发安全的几种解决方案与性能对比

Kotlin协程基本套餐:协程的基本使用协程的上下文理解协程的作用域管理协程的常见进阶使用之前的系列文章我们讲的是一些 Kotlin 协程的基本概念和一些实用与常用的技巧与方法。其实明白之后,基本的使用是没有问题了。那么今天我想探讨一下,没…

用gin写简单的crud后端API接口

提要使用gin框架(go的web框架)来创建简单的几个crud接口)使用技术: gin sqlite3 sqlx创建初始工程新建文件夹,创建三个子文件夹分别初始化工程 go mod如果没有.go文件,执行go mod tidy可能报错(warning: "all" matched no packages), 可以先不弄,只初始化模块就行(…

GreenPlum小结

什么是GreenPlum?GreenPlum是业界最快最高性价比的关系型分布式数据库,它在开源的PostgreSQL的基础上采用MPP架构(Massive Parallel Processing,海量并行处理),具有强大的大规模数据分析任务处理能力。GreenPlum作为大数据融合存储…

【UE4 RTS游戏】03-摄像机运动_旋转视角

效果可以通过WASD控制“CameraPawn”的移动;通过鼠标中键旋转视角;通过alt鼠标中键将视角回归默认值;通过shift加速移动。步骤打开“CameraPawnController”,给如下节点添加注释,命名为“MovementX”接下来开始开始编辑…

JDK解压安装及idea开发工具配置

1. 安装JDK 1.1 下载安装包 下载安装包,直接解压,注意,解压的路径不要有中文 1.2 配置环境变量 右键点击我的电脑,选择属性 选择高级系统设置 选择环境变量 选择新建 在变量名中输入JAVA_HOME,变量值就是1.1中压缩包…

Windows环境下实现设计模式——访问者模式(JAVA版)

我是荔园微风,作为一名在IT界整整25年的老兵,今天总结一下Windows环境下如何编程实现访问者模式(设计模式)。不知道大家有没有这样的感觉,看了一大堆编程和设计模式的书,却还是很难理解设计模式&#xff0c…

【C++】类和对象(收尾)

文章目录成员变量初始化问题初始化列表explicit关键字static成员特性:友元友元函数友元类内部类特性匿名对象成员变量初始化问题 在创建对象时,编译器通过调用构造函数,给了对象中各个成员变量一个合适的初始值。但是这并不能够称为对对象中成…

简单了解蓄电池在直流系统中的使用现状!

一般情况下,由市电通过直流配电屏为变电站的直流系统提供工作电源,包括对蓄电池组进行饱和和充电使蓄电池处于备用状态,当交流失电或系统需要进行大电流供电时,蓄电池需要迅速切入,向事故负荷、自动装置、保护装置以及…

本地套接字

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 本地套接字专栏:《Linux从小白到大神》《网络编程》 本地套接字通信需要一个文件&#xff…

tensorflow【import transformers 报错】

目录 一、安装 安装好了tensorflow,但是import时候报错: import transformers 报错 一、安装 (1)创建环境: conda create -n [name] python3.3-3.7 (2)激活环境: conda activate [name] …