你好,我是林森lsjs
我的Github地址: sqyCoder (Qiyang) · GitHub


目录
[一、Java 入门:梦开始的地方](#一、Java 入门:梦开始的地方)
[Java 核心基础认知](#Java 核心基础认知)
[第一个 Java 程序与基础规范](#第一个 Java 程序与基础规范)
[this 关键字](#this 关键字)
[super 关键字](#super 关键字)
[十、String 类(面试高频)](#十、String 类(面试高频))
[String、StringBuilder、StringBuffer 区别](#String、StringBuilder、StringBuffer 区别)
[try-catch-finally 捕获异常](#try-catch-finally 捕获异常)
[throws 声明异常](#throws 声明异常)
[JDK8 新版日期时间类(推荐](#JDK8 新版日期时间类(推荐)
一、Java 入门:梦开始的地方
Java 核心基础认知
Java 是一门面向对象、跨平台、可移植、高性能的编译型+解释型语言,核心优势是「一次编写,到处运行」,依托 JVM 实现跨平台特性。
核心三大组件:
JDK(Java开发工具包):包含 JRE + 编译、运行、调试等开发工具,开发必备
JRE(Java运行环境):包含 JVM + 核心类库,仅用于运行 Java 程序
JVM(Java虚拟机):解析运行 class 字节码文件,实现跨平台,是 Java 跨平台的核心
第一个 Java 程序与基础规范
Java 程序执行流程:编写 .java 源文件 → javac 编译生成 .class 字节码文件 → java 命令运行字节码文件。
基础编码规范:
类名大驼峰、方法/变量小驼峰、常量全大写、包名全小写
严格区分大小写,语句以分号结尾
公共类名必须与源文件名一致
变量与数据类型
变量是内存中临时存储数据的空间,是程序运算的基础。Java 数据类型分为两大类:
基本数据类型(8种):
-
整型:byte、short、int、long
-
浮点型:float、double
-
字符型:char
-
布尔型:boolean
引用数据类型:类、接口、数组、字符串等,存储的是对象的内存地址
数据类型转换:自动转换(小转大)、强制转换(大转小,可能丢失精度)
二、输入与输出
输入输出是程序与人交互的核心方式,是所有实战代码的基础。
控制台输出
-
System.out.println():打印内容并换行 -
System.out.print():打印内容不换行 -
System.out.printf():格式化输出,支持占位符(%d、%s、%f 等)
控制台输入(Scanner)
通过 java.util.Scanner 类实现手动录入数据,使用步骤:导包 → 创建对象 → 接收数据 → 关闭流。
java
// 1.导包
import java.util.Scanner;
public class InputDemo {
public static void main(String[] args) {
// 2.创建Scanner对象
Scanner sc = new Scanner(System.in);
// 3.接收输入
System.out.print("请输入整数:");
int num = sc.nextInt();
System.out.println("输入的数字是:" + num);
// 4.关闭流
sc.close();
}
}
常用接收方法:nextInt()、nextDouble()、next()(接收字符串,空格截断)、nextLine()(接收整行字符串)。
三、运算符
运算符用于数据运算、逻辑判断、赋值操作,是程序逻辑的核心组成部分,Java 运算符分为六大类。
算术运算符
+、-、*、/、%、++、--
-
整数相除结果为整数,小数相除结果为小数
-
% 取模,常用于判断奇偶、整除
-
++/-- 前置先运算后赋值,后置先赋值后运算
赋值运算符
=、+=、-=、*=、/=、%=,复合赋值运算符自带强制类型转换,不会丢失精度。
关系运算符
>、<、>=、<=、==、!=,运算结果均为 boolean 类型(true/false),常用于条件判断。
逻辑运算符
用于连接多个条件,核心:短路与 &&、短路或 ||、非 !
-
&&:一假则假,左边为假直接短路,不执行右边
-
||:一真则真,左边为真直接短路,不执行右边
三元运算符
格式:条件表达式 ? 表达式1 : 表达式2
规则:条件为 true 执行表达式1,为 false 执行表达式2,适合简单二选一逻辑。
位运算符
&、|、^、~、<<、>>、>>>,底层二进制运算,常用于底层开发、性能优化。
四、数组
数组是相同数据类型的有序集合,属于引用类型,可存储批量数据,长度固定不可修改。
一维数组
定义格式:
// 动态初始化:指定长度 int[] arr1 = new int[5];
// 静态初始化:直接赋值 int[] arr2 = {1,2,3,4,5};
核心特点:下标从 0 开始,最大下标为 长度-1,超出下标会报 ArrayIndexOutOfBoundsException 数组越界异常。
常用操作:普通 for 循环遍历、增强 for 循环遍历、求最大值/最小值、求和、排序。
二维数组
数组中的数组,适合存储表格、矩阵类数据,支持动态、静态初始化,双层循环完成遍历。
java
int[][] arr = {{1,2},{3,4},{5,6}};
// 双层遍历
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + " ");
}
}
五、方法
方法是封装重复代码、实现代码复用的最小单元,提升代码简洁性、可读性、维护性。
方法定义与调用
格式:修饰符 返回值类型 方法名(参数列表){ 方法体 return 返回值; }
-
无返回值使用 void,有返回值必须匹配对应类型并 return
-
参数列表分为形参(定义时)和实参(调用时)
方法重载
同一个类中,多个方法方法名相同,参数列表不同(个数、类型、顺序),与返回值、修饰符无关。作用:统一功能接口,简化调用。
递归方法
方法自身调用自身,必须包含递归出口,否则无限递归导致栈溢出(StackOverflowError),适合阶乘、斐波那契数列、文件遍历等场景。
六、类和对象(面向对象核心基础)
Java 是纯面向对象语言,核心思想:万物皆对象。类是对象的模板,对象是类的实例。
类与对象的关系
类:抽象模板,描述事物的属性(成员变量)和行为(成员方法)
对象:具体实例,根据类模板创建的真实个体
创建对象:类名 对象名 = new 类名();
成员变量与局部变量
| 对比维度 | 成员变量 | 局部变量 |
|---|---|---|
| 定义位置 | 类中方法外 | 方法内、代码块内 |
| 默认值 | 有默认初始值 | 无默认值,必须手动赋值 |
| 生命周期 | 随对象创建而存在,对象销毁而消失 | 随方法调用而生,方法结束而销毁 |
| 作用域 | 整个类有效 | 仅当前代码块有效 |
构造方法
创建对象时自动调用,用于初始化成员变量。特点:方法名与类名一致,无返回值类型。
-
无参构造:默认存在,手动定义有参构造后默认无参构造失效
-
有参构造:自定义初始化参数,灵活赋值
this 关键字
-
this.成员变量:区分局部变量和成员变量重名
-
this():调用本类无参构造,必须放在构造方法第一行
-
this(参数):调用本类有参构造
封装(面向对象三大特性之一)
核心:隐藏内部细节,暴露公共访问方式。实现方式:private 私有化成员变量,提供 public 的 get/set 方法。
作用:保护数据安全性、提高代码复用性、降低耦合。
七、继承
继承是面向对象三大特性之二,核心:子类复用父类代码,实现代码复用与扩展。
继承语法与特点
语法:class 子类 extends 父类{}
-
Java 支持单继承,一个子类只能有一个直接父类,一个父类可以有多个子类
-
子类继承父类非私有属性和方法,无法继承 private 成员、构造方法
-
所有类默认直接或间接继承 Object 类(根父类)
super 关键字
-
super.父类成员:访问父类被重写的成员变量/方法
-
super():调用父类无参构造,默认隐含,必须在第一行
-
super(参数):调用父类有参构造
方法重写(Override)
子类对父类已有方法进行功能重构,重写规则:方法名、参数列表、返回值完全一致,权限修饰符范围大于等于父类,不能抛出更宽泛的异常。作用:适配子类特有业务逻辑。
权限修饰符
权限范围从小到大:private(本类)< 默认(同包)< protected(同包+子类)< public(全局)
八、多态
多态是面向对象三大特性之三,是面向对象最核心、最重要的特性,核心思想:一个行为,多种实现。
多态实现条件
-
存在继承关系
-
存在方法重写
-
父类引用指向子类对象(向上转型)
转型机制
-
向上转型(自动):父类引用 子类对象,多态核心形态,只能调用父类方法,执行子类重写逻辑
-
向下转型(强制):子类引用 = (子类)父类对象,用于调用子类特有方法,需规避类型转换异常
多态核心优势
符合开闭原则:对扩展开放,对修改关闭。新增子类无需修改原有核心代码,仅需新增实现类,大幅提升代码扩展性与维护性,彻底避免大量 if-else 判断。
九、抽象类和接口
抽象类与接口是面向对象抽象设计的核心,用于定义规范、约束子类行为,是项目解耦的关键。
抽象类(abstract)
-
被 abstract 修饰的类,不能实例化,只能被继承
-
包含抽象方法(无方法体),也可包含普通成员、普通方法、构造方法
-
子类继承抽象类,必须重写所有抽象方法,否则子类也需抽象
接口(interface)
接口是行为规范的集合,是比抽象类更纯粹的抽象,JDK8 前后特性不同:
-
JDK7及以前:只能有全局常量、抽象方法
-
JDK8:新增默认方法、静态方法
-
JDK9:新增私有方法
核心特点:无构造方法、不能实例化、支持多实现、解决 Java 单继承局限。
抽象类与接口核心区别
-
抽象类:是「事物模板」,有成员变量、构造方法,单继承,侧重属性与行为整体抽象
-
接口:是「行为规范」,无实例变量、无构造方法,多实现,侧重行为约束
十、String 类(面试高频)
String 是 Java 最常用的引用类型,代表字符串,是面试与开发核心高频知识点。
核心特性
字符串不可变:String 底层为 final 修饰的字符数组(JDK9+为字节数组),一旦创建无法修改,所有拼接、截取操作都会生成新字符串对象。
不可变优势:线程安全、可存入字符串常量池、适合作为 HashMap 键、缓存哈希值。
常量池机制
直接赋值 String s = "abc" 会存入字符串常量池,复用对象,节省内存;new String() 会直接在堆内存创建新对象,不触发常量池复用。
常用核心方法
-
获取:length()、charAt()、indexOf()、lastIndexOf()
-
判断:equals()、equalsIgnoreCase()、contains()、startsWith()、isEmpty()
-
转换:toCharArray()、split()、trim()、toUpperCase()、toLowerCase()
-
截取替换:substring()、replace()
String、StringBuilder、StringBuffer 区别
-
String:不可变,线程安全,少量拼接使用
-
StringBuilder:可变,线程不安全,效率高,单线程大量拼接首选
-
StringBuffer:可变,线程安全,效率低,多线程大量拼接使用
十一、异常处理
异常是程序运行时出现的非正常情况,Java 通过异常体系实现错误精准捕获与处理,避免程序直接崩溃。
异常体系结构
顶层父类:Throwable
-
Error(系统级错误):无法处理,虚拟机层面问题,如 StackOverflowError、OutOfMemoryError
-
Exception(可处理异常)
-
编译时异常(受检异常):必须处理,如 IOException、SQLException
-
运行时异常(非受检异常):RuntimeException,可选择性处理,如空指针、数组越界、类型转换异常
异常处理方式
try-catch-finally 捕获异常
java
try{
// 可能出现异常的代码
}catch(异常类型 e){
// 异常处理逻辑
}finally{
// 无论是否异常都会执行,常用于释放资源
}
throws 声明异常
在方法签名声明异常,将异常抛出给调用者处理,适合自身无法处理的异常场景。
自定义异常
继承 Exception 或 RuntimeException,自定义业务异常,用于精准区分业务错误与系统错误,提升项目健壮性。
十二、日期时间类
Java 提供多套日期时间 API,分为传统旧版(线程不安全)与 JDK8 新版(线程安全、推荐)。
旧版日期类
-
Date:获取系统当前时间,默认精确到毫秒
-
SimpleDateFormat:日期格式化与解析,线程不安全,不推荐并发场景使用
-
Calendar:日历工具类,用于日期加减、字段修改、时间计算
JDK8 新版日期时间类(推荐)
全新 java.time 包下,线程安全、不可变、API简洁,是开发首选:
-
LocalDate:仅日期(年月日)
-
LocalTime:仅时间(时分秒)
-
LocalDateTime:日期+时间
就到这了,我们javase语法学习结束啦,进入数据结构!
++诸位共勉!++
