Java SE基础知识

Java SE 基础知识

一、Java虚拟机(JVM)

二、Java的加载与执行原理

三、JDK、JRE、JVM分别是什么?他们的关系是什么?

  1. JDK(Java Development Kit):
    JDK 是 Java 开发工具包,它是 Java 开发者用来开发 Java 应用程序的核心组件。JDK 包括了 Java 编译器(javac)、Java 运行时环境(JRE)、Java 文档生成器(Javadoc)以及其他一些开发工具和库。简而言之,JDK 提供了开发 Java 应用程序所需的所有工具和资源。

  2. JRE(Java Runtime Environment):
    JRE 是 Java 运行时环境,它是在运行 Java 应用程序时所必需的环境。JRE 包含了 Java 虚拟机(JVM)以及 Java 核心类库和支持文件。当用户想要运行一个已编译的 Java 应用程序时,他们需要安装 JRE。JRE 提供了 Java 应用程序的运行环境,但不包含开发工具。

  3. JVM(Java Virtual Machine):
    JVM 是 Java 虚拟机,它是 Java 程序的运行环境。JVM 负责在实际的硬件平台上执行 Java 字节码(即编译后的 Java 代码)。JVM 负责加载字节码、解释执行或即时编译字节码为本地机器代码,并管理内存、执行垃圾回收等任务。JVM 的存在使得 Java 能够实现“一次编写,到处运行”的特性。

四、class和public class的区别

  1. 一个 Java 源文件可以定义多个 class。
  2. 编译之后,一个 class 就会对应生成一个 class 字节码文件。
  3. 如果一个类是 public,类名必须要和源文件名保持一致。
  4. public 类可以没有,如果有的话也只能有一个。
  5. 每个类中都可以编写入口 main 方法。在实际开发中,入口一般只有一个。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class A{
public static void main(String[] args) {
System.out.println("A执行了");
}
}
class B{
public static void main(String[] args) {
System.out.println("B执行了");
}
}
public class X{
public static void main(String[] args) {
System.out.println("X执行了,这个 Java 源文件名为 X.java");
}
}

五、Java标识符命名规范

遵循驼峰式命名方法。

  • 类名、接口名: 首字母大写,后面每个单词首字母大写。 StudentService
  • 变量名、方法名: 首字母小写,后面每个单词首字母大写。 productPrice
  • 常量名: 全部大写,每个单词之间采用”_”分隔。 LOGIN_SUCCESS
  • 包名: 全部小写。 com.camellia.javase.extends

六、Java中的加号运算符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class PlusTest{
public static void main(String[] args) {
int a=10;
int b=20;
String str="10";
// 字符串拼接
System.out.println(str + b); // 1020;

str="30";
// 当一个表达式中出现多个+,若没有(),遵循从左到右。
System.out.println(a + b + str); // 3030;

// 添加了()优先级比较高。
System.out.println(a+(b+str)); // 102030

}
}

七、变量的分类

  • 局部变量(Local Variables):
    在方法、代码块或构造方法中声明的变量称为局部变量。局部变量只在其声明的范围内可见,超出该范围就无法访问。局部变量的生命周期仅在其声明的代码块、方法或构造方法执行期间。当代码块或方法执行完毕时,局部变量将被销毁。

  • 成员变量(Instance Variables):
    在类中声明的变量,但在方法之外,类的任何地方都可以访问,称为成员变量或实例变量。每个对象都有一份成员变量的副本,它们属于对象的状态。成员变量的生命周期与对象的生命周期相同。它们随着对象的创建而创建,随着对象的销毁而销毁。

  • 静态变量(Static Variables):
    使用 static 关键字声明的成员变量称为静态变量。静态变量属于类而不是对象,在类加载时初始化,并且所有对象共享同一份静态变量。静态变量的生命周期与类的生命周期相同。它们在类加载时初始化,随着类的卸载而销毁。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*
变量可以根据定义/声明的位置来进行分类,可以分为两大类:
1、局部变量
2、成员变量
- 静态变量
- 实例变量
*/
public class VarClassify {
public static void main(String[] args) {
// 凡是在方法体中定义的变量,一定是局部变量。
// 局部变量只在当前方法体中有效。
int a=100;
}

// 在类中定义的变量叫做成员变量。
// 实例变量
int b=200;
// 静态变量
static int c=300;
}

总结:

Java 是一种混合型语言,既有编译阶段也有解释阶段。

  1. 编译阶段
  • 当编写的 Java 代码(源代码,.java 文件)被编译时,Java 编译器(javac)会将其转换为中间的字节码文件(.class 文件),而不是直接生成可执行的机器代码。这一步是编译阶段,相当于传统编译型语言(如 C、C++)的编译过程。
  • 字节码是一种跨平台的中间代码,能够在任何支持 Java 虚拟机(JVM)的系统上运行。
  1. 解释阶段
  • 编译后的字节码不能直接在计算机的硬件上运行,而是由 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]

  1. ==1KB=1024byte==
  2. ==1MB=1024KB==
  3. 1GB=1024MB
  4. 1TB=1024GB

8.2、原码、反码、补码概念及其转换

源码、反码和补码是计算机中用于表示整数的不同方式,它们在位操作和计算中起着重要作用。下面是它们的概念以及如何相互转换:

8.2.1、概念

  1. 原码(源码)

    • 原码是整数的最基本的二进制表示形式。
    • 正数的原码与其二进制表示形式相同,即最高位为 0。
    • 负数的原码最高位为 1,其余位为对应正数的二进制表示。
  2. 反码

    • 反码是在原码的基础上,正数的反码与原码相同,负数的反码是原码除符号位外,各位取反得到的。
    • 例如,对于 8 位的二进制数,正数的反码和原码相同,负数的反码是除符号位外各位取反。
  3. 补码

    • 补码是在反码的基础上,正数的补码与原码相同,负数的补码是其反码加 1。
    • 例如,对于 8 位的二进制数,正数的补码和原码相同,负数的补码是其反码加 1。

8.2.2、转换

转换过程:

  • 正数的原码、反码、补码都相同。
  • 负数的反码是将原码除符号位外各位取反得到的。
  • 负数的补码是将其反码加 1 得到的。

举例来说,假设有一个 8 位二进制补码表示的负数 -5,补码为 11111011。按照上述步骤转换为原码:

  1. 判断符号位:符号位为 1,表示是负数。
  2. 求反码:除符号位外的各位取反,得到 10000100(反码)。
  3. 求反码加 1:将反码加 1,得到 10000101(原码)。

[!NOTE]

补码转换为原码

  1. 判断补码的符号位: 补码的最高位是符号位。如果符号位为 0,则表示补码表示的是正数;如果符号位为 1,则表示补码表示的是负数。

  2. 分情况讨论:

    • 如果补码表示的是正数,则补码、原码和反码相同,直接将补码作为原码即可。
    • 如果补码表示的是负数,则执行下面的步骤:
  3. 求补码的反码: 将补码除符号位外的各位取反,得到反码。

  4. 求反码加 1: 将反码加 1,得到原码。

其中值得注意的是-128,它的源码与补码相同。 其原码、反码、补码如下:

  • 原码:10000000
  • 反码:11111111
  • 补码:10000000

所以一个byte(字节)的范围是-128~127,可以表示256种不同的情况(中间包含一个零)。

计算机底层采用的是补码。

总结:

Java是一种混合型语言,既有编译阶段也有解释阶段(在面试的时候面试官可能会问Java是编译型语言还是解释性语言?)