自学内容网 自学内容网

Java基础——必须掌握的核心概念

>该文章的主要内容,包括 Java 基础知识、Java 程序的运行过程、变量与类型、运算细节、面向对象编程的核心概念和方法、JVM 的设计目标等。这些是我整理所学Java知识点的二次提炼,被一些网友说是八股文,确实哎!这知识点越是提炼,越是抽象。掌握这些知识后,还是得多敲代码,这些东西只是帮你更好地理解你所敲的代码,不迷茫,不要本末倒置哦!

## **Java 程序基础**

### **Java 程序的运行过程:**

1. 编译:
   Java 源代码经过编译器编译成字节码文件,该文件与平台无关。
2. 加载:
   字节码文件被 JVM 的类加载器加载到内存中。类加载器负责查找和加载类文件,并将其转换为 JVM 可以理解的格式。
3. 字节码校验:
   加载后的文件,经过 JVM 的字节码校验器进行校验,确保字节码的安全性和正确性。
4. 解释执行:
   JVM 的解释器会逐条解释字节码指令,将其转换为机器码并执行。(end)
5. 即时编译(JIT)
   为了提高性能,JVM 还提供了即时编译技术。JIT 编译器会在运行时将经常执行的代码编译成机器码,从而提高执行效率。
6. 垃圾回收
   JVM 内置了垃圾回收机制,自动管理内存,回收不再使用的对象,减少内存泄漏和其他内存管理问题。

### **程序基本结构**

1. 一个 Java 源码只能定义一个 public 类型的 class,并且 class 名称和文件名要完全一致;
2. 使用 javac 可以将 .java 源码编译成.class 字节码。

### **变量与类型(细节)**

1. Java 提供了两种变量类型:基本类型和引用类型。基本类型包括整型,浮点型,布尔型,字符型。
2. 变量可重新赋值,等号是赋值语句,不是数学意义的符号。
3. 常量在初始化后不可重新赋值,使用常量便于理解程序意图。

### **整数运算(细节)**

1. 整数运算的结果永远是精确的;
2. 运算结果会自动提升;
3. 可以强制转型,但超出范围的强制转型会得到错误的结果;
4. 应该选择合适范围的整型,没必要为了节省内存而使用 byte 和 short 进行整数运算。

### **浮点数运算(细节)**

1. 浮点数常常无法精确表示,并且浮点数的运算结果可能有误差;
2. 比较两个浮点数通常比较它们的差的绝对值是否小于一个特定值;
3. 整型和浮点型运算时,整型会自动提升为浮点型;
4. 可以将浮点型强制转为整型,但超出范围后将始终返回整型的最大值。

### **基本类型变量 vs 引用类型变量**

1. 基本类型变量存储的是对象本身的值,当变量内容发生变化时,新的值会覆盖掉之前的值,不会重新分配新的内存空间。
2. 引用类型变量类似于指针,存储的是对象的内存地址,而不是对象本身的实际值。这使得多个引用类型变量可以引用同一个对象,修改其中一个变量的内容会影响到其它引用该对象的变量。
3. 当引用类型的变量内容发生变化时,是否创建新的内存空间取决于具体的编程语言和内存管理机制。

### **数组(细节)**

1. 数组是同一数据类型的集合,数组一旦创建后,大小就不可变;
2. 可以通过索引访问数组元素,但索引超出范围将报错;
3. 数组元素可以是值类型,或者引用类型,但数组本身是引用类型。

### **流程控制**

在 Java 程序中,JVM 默认总是顺序执行以分号结束的语句。但是,在实际的代码中,程序经常需要做出条件判断,循环。因此,需要有多种流程控制语句,来实现程序的跳转和循环等功能。

### **”==“ 的作用**

1. 可以判断值类型是否相等。
2. 判断引用类型的变量时,指的是这两个是否指向同一个对象。如果判断对象具体内容是否相等,就需要 equals()方法。

## **面向对象基础**

### **面向对象编程**

1. 面向过程编程,是把模型分解成一步一步的过程。
2. 面向对象编程,是一种通过对象的方式,把现实世界映射到计算机模型的一种编程方法。
3. 在 OOP 中,class 和 instance 是"模板"和"实例"的关系,定义 class 就是定义了一种数据类型,对应的 instance 是这种数据类型的实例。
4. 通过 new 操作符创建新的 instance,然后用变量指向它,就可以通过变量引用这个 instance。
5. 指向 instance 的变量都是引用变量。

### **方法**

1. 方法可以让外部代码安全地访问实例字段。
2. 方法是一组执行语句,并且可以执行任意逻辑。
3. 方法内部遇到 return 时返回,void 表示不返回任何值;
4. 外部代码通过 public 方法操作实例,内部代码可以调用 private 方法。

### **构造器(构造方法)**

1. 实例在创建时通过 new 操作符调用对应的构造方法,用于初始化实例;
2. 没有定义构造方法时,编译器会自动创建一个默认的无参构造器;
3. 可定义多个构造方法,编译器根据参数自动判断;
4. 可以在一个构造器中调用另一个构造器,便于代码的复用。

### **方法重载**

1. 方法重载是指多个方法的 方法名相同,各自的参数不同,返回值类型通常相同。
2. 方法重载的目的是,功能类似的方法使用同一名字,容易记并且调用起来更简单。

### **继承**

1. 继承是面向对象编程的一种强大的代码复用方式,Java 只允许单继承,所有类最终的根类是 Object。
2. 子类无法访问父类的 private 的属性和方法;
3. 父类 protected 修饰的字段可以被子类访问,protected 关键字可以把字段和方法的访问权限控制在继承树的内部。
4. 子类的构造方法可以通过 super()调用父类的构造方法。
5. 向上转型:把子类类型安全地变为父类类型的赋值,被称为向上转型。
6. 向上转型:用 instanceof 判断一个变量所指向的实例是否是指定类型或者类型的子类,才能将该变量向下转型。
7. 两个类是 is 的关系,才叫做继承,才能 extend;如果两个类是使用的关系,has 的关系,可以将一个类的对象作为另一个类的属性。

### **多态**

1. Java 的实例方法调用是基于运行时的实际类型的动态调用,而非变量的声明类型。
2. Java 的动态绑定机制:

- 当调用对象方法时,该方法会和该对象的实际类型(运行类型)绑定,进行使用;
- 当调用对象属性时,没有动态绑定机制,在哪里声明,就哪里使用;

3. 覆写 Object 类的方法,因为所有的 class 最终都继承自 Object,Object 定义了几个方法 toString(),equals(),hashCode(),在必要的情况下,我们可以覆写这些方法。
4. final 修饰符

- final 修饰的方法可以阻止被覆写;
- final 修饰的类可以阻止被继承;
- final 修饰的属性 必须在创建对象时初始化,随后不可修改。

#### **抽象类**
1. 如果一个class定义了方法,但没有具体执行代码,这个方法就是抽象方法,抽象方法用abstract修饰;
2. 使用了抽象方法的类,就是抽象类。但是无法实例化一个抽象类,抽象类只能被继承。
3. 面向对象编程的本质是上层代码只定义规范,不需要考虑子类的实现。

### **接口**
1. 如果一个抽象类中没有字段,所有的方法都是抽象方法,则该抽象类就是接口,改名为interface。一个类可以实现多个接口。
2. 接口也是数据类型,适用于向上转型和向下转型。

### **静态字段和静态方法**
1. 静态字段属于所有实例"共享"的字段,实际上是属于 class 这个类的字段。
2. 调用静态方法不需要实例,无法访问this,静态方法只能可以访问静态字段和其它静态方法;
3. 静态方法常用于工具类和辅助方法。  

### **包**
1. Java定义了一种名字空间,称之为包,package。一个类总是属于某个包。Java内建的package机制是为了避免class命名冲突。
2. 如果要调用其它包的class,可以使用import
3. 编译器会默认自动启动 当前包的其它class,默认启动java.lang包。

### **作用域**
1. public修饰的class,interface可以被其它任何类访问。
2. private修饰的字段和方法的访问权限限定在class内部,其它类无法访问,但是该class的嵌套类可以访问。
3. protected 作用于继承关系。定义protected的字段和方法可以被子类访问,以及子类的子类。
4. 包作用域是指一个类允许访问同一个package的类。
5. Java在方法内部定义的变量是局部变量,局部变量的作用域是从变量声明开始,到一个块结束。

## **Java核心类**

### **String类**
1. Java字符串的一个重要特点就是字符串不可变。这种不可变性是通过内部的private final char[] 字段实现的,但是较新的JDK是用byte[]存储的。
2. 字符串操作不改变元字符串内容,而是返回新字符串。
3. 当比较两个字符串时,必须使用equals()方法。

### **字符编码**
为了统一全球所有语言的编码,全球统一码联盟发布了Unicode编码。
UTF-8编码,是一种变长编码,用来把固定长度的Unicode编码变成变长编码。

### **StringBuilder类**
1. Java标准库提供了StringBuilder,它是可变的,可以预分配缓冲区,在新增字符时,不会创建新的临时对象,可以高效拼接字符串。
2. StringBuffer 是 StringBuilder 的线程安全版本,现在很少使用。

### **包装类**
1. 每个基本类型都有包装类,Java编译器能自动装箱和自动拆箱,在编译期间完成。
2. 所有的包装类型都是不变类,都是被final修饰的,与String一样。关于包装类型的数据进行比较,也得使用equals()方法。
3. 整数和浮点数的包装类型都继承自Number。

### **常用工具类**
1. Math:数学计算
2. Random:生成随机数


### **JVM 的设计目标**

提供一个与硬件无关的抽象计算机模型,使得 Java 程序可以在各种平台上运行。

1. 跨平台兼容性:Java 程序编译成字节码后,可以在任何安装了 JVM 的系统上运行。
2. 安全性:JVM 提供了多层次的安全机制,确保 Java 程序在执行过程中不会对系统造成危害。
3. 性能优化:通过即时编译(JIT)和垃圾回收(GC)等技术,JVM 能够在运行时优化程序性能。
4. 多线程支持:JVM 内置了对多线程的支持,使得 Java 程序可以高效地进行并发处理。
 


原文地址:https://blog.csdn.net/m0_74403543/article/details/142443166

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!