Java SE基础知识
Java SE基础知识
CAMELLIAJava SE 基础知识
一、Java虚拟机(JVM)
二、Java的加载与执行原理
三、JDK、JRE、JVM分别是什么?他们的关系是什么?
JDK(Java Development Kit):
JDK 是 Java 开发工具包,它是 Java 开发者用来开发 Java 应用程序的核心组件。JDK 包括了 Java 编译器(javac)、Java 运行时环境(JRE)、Java 文档生成器(Javadoc)以及其他一些开发工具和库。简而言之,JDK 提供了开发 Java 应用程序所需的所有工具和资源。JRE(Java Runtime Environment):
JRE 是 Java 运行时环境,它是在运行 Java 应用程序时所必需的环境。JRE 包含了 Java 虚拟机(JVM)以及 Java 核心类库和支持文件。当用户想要运行一个已编译的 Java 应用程序时,他们需要安装 JRE。JRE 提供了 Java 应用程序的运行环境,但不包含开发工具。JVM(Java Virtual Machine):
JVM 是 Java 虚拟机,它是 Java 程序的运行环境。JVM 负责在实际的硬件平台上执行 Java 字节码(即编译后的 Java 代码)。JVM 负责加载字节码、解释执行或即时编译字节码为本地机器代码,并管理内存、执行垃圾回收等任务。JVM 的存在使得 Java 能够实现“一次编写,到处运行”的特性。
四、class和public class的区别
- 一个 Java 源文件可以定义多个 class。
- 编译之后,一个 class 就会对应生成一个 class 字节码文件。
- 如果一个类是 public,类名必须要和源文件名保持一致。
- public 类可以没有,如果有的话也只能有一个。
- 每个类中都可以编写入口 main 方法。在实际开发中,入口一般只有一个。
1 | class A{ |
五、Java标识符命名规范
遵循驼峰式命名方法。
- 类名、接口名: 首字母大写,后面每个单词首字母大写。
StudentService
- 变量名、方法名: 首字母小写,后面每个单词首字母大写。
productPrice
- 常量名: 全部大写,每个单词之间采用”_”分隔。
LOGIN_SUCCESS
- 包名: 全部小写。
com.camellia.javase.extends
六、Java中的加号运算符
1 | public class PlusTest{ |
七、变量的分类
局部变量(Local Variables):
在方法、代码块或构造方法中声明的变量称为局部变量。局部变量只在其声明的范围内可见,超出该范围就无法访问。局部变量的生命周期仅在其声明的代码块、方法或构造方法执行期间。当代码块或方法执行完毕时,局部变量将被销毁。成员变量(Instance Variables):
在类中声明的变量,但在方法之外,类的任何地方都可以访问,称为成员变量或实例变量。每个对象都有一份成员变量的副本,它们属于对象的状态。成员变量的生命周期与对象的生命周期相同。它们随着对象的创建而创建,随着对象的销毁而销毁。静态变量(Static Variables):
使用 static 关键字声明的成员变量称为静态变量。静态变量属于类而不是对象,在类加载时初始化,并且所有对象共享同一份静态变量。静态变量的生命周期与类的生命周期相同。它们在类加载时初始化,随着类的卸载而销毁。
1 | /* |
总结:
Java 是一种混合型语言,既有编译阶段也有解释阶段。
- 编译阶段:
- 当编写的 Java 代码(源代码,
.java
文件)被编译时,Java 编译器(javac
)会将其转换为中间的字节码文件(.class
文件),而不是直接生成可执行的机器代码。这一步是编译阶段,相当于传统编译型语言(如 C、C++)的编译过程。- 字节码是一种跨平台的中间代码,能够在任何支持 Java 虚拟机(JVM)的系统上运行。
- 解释阶段:
- 编译后的字节码不能直接在计算机的硬件上运行,而是由 Java 虚拟机(JVM)加载并执行。JVM 扮演了解释器的角色,它会逐行读取字节码,并将其翻译成目标机器的本地代码,进行执行。这个过程就是 Java 的解释阶段。
- 另外,JVM 采用了即时编译(JIT,Just-In-Time Compilation)技术,这种技术在程序运行时,将热点代码(即多次执行的代码)编译为本地机器代码,以提高性能。这也是一种将解释和编译相结合的优化方式。
八、原码、反码、补码
8.1、byte与bit
- byte(字节)是计算机存储和处理数据的基本单位,通常由8个bit(比特)组成。 每个bit(比特)是计算机中最小的存储单位,只能存储0或者1两个状态。所以,一个byte(字节)可以存储8个bit(比特)的数据。
- 2在计算机中,数据通常以byte(字节)为单位进行存储和传输,而bit(比特)则是用来表示数据的最小单位。
[!IMPORTANT]
- ==1KB=1024byte==
- ==1MB=1024KB==
- 1GB=1024MB
- 1TB=1024GB
8.2、原码、反码、补码概念及其转换
源码、反码和补码是计算机中用于表示整数的不同方式,它们在位操作和计算中起着重要作用。下面是它们的概念以及如何相互转换:
8.2.1、概念
原码(源码):
- 原码是整数的最基本的二进制表示形式。
- 正数的原码与其二进制表示形式相同,即最高位为 0。
- 负数的原码最高位为 1,其余位为对应正数的二进制表示。
反码:
- 反码是在原码的基础上,正数的反码与原码相同,负数的反码是原码除符号位外,各位取反得到的。
- 例如,对于 8 位的二进制数,正数的反码和原码相同,负数的反码是除符号位外各位取反。
补码:
- 补码是在反码的基础上,正数的补码与原码相同,负数的补码是其反码加 1。
- 例如,对于 8 位的二进制数,正数的补码和原码相同,负数的补码是其反码加 1。
8.2.2、转换
转换过程:
- 正数的原码、反码、补码都相同。
- 负数的反码是将原码除符号位外各位取反得到的。
- 负数的补码是将其反码加 1 得到的。
举例来说,假设有一个 8 位二进制补码表示的负数 -5,补码为 11111011。按照上述步骤转换为原码:
- 判断符号位:符号位为 1,表示是负数。
- 求反码:除符号位外的各位取反,得到 10000100(反码)。
- 求反码加 1:将反码加 1,得到 10000101(原码)。
[!NOTE]
补码转换为原码:
判断补码的符号位: 补码的最高位是符号位。如果符号位为 0,则表示补码表示的是正数;如果符号位为 1,则表示补码表示的是负数。
分情况讨论:
- 如果补码表示的是正数,则补码、原码和反码相同,直接将补码作为原码即可。
- 如果补码表示的是负数,则执行下面的步骤:
求补码的反码: 将补码除符号位外的各位取反,得到反码。
求反码加 1: 将反码加 1,得到原码。
其中值得注意的是-128,它的源码与补码相同。 其原码、反码、补码如下:
- 原码:10000000
- 反码:11111111
- 补码:10000000
所以一个byte(字节)的范围是-128~127,可以表示256种不同的情况(中间包含一个零)。
计算机底层采用的是补码。
总结:
Java是一种混合型语言,既有编译阶段也有解释阶段(在面试的时候面试官可能会问Java是编译型语言还是解释性语言?)