学校-Java程序设计知识点总结
学校-Java程序设计知识点总结
课时一 对象和封装
现实世界与面向对象
- 现实世界由对象组成
- 面向对象的目的:用计算机描述现实世界、解决现实世界问题
- 面向对象优势:交流流畅,提高设计和开发效率
面向对象描述世界的步骤
- 发现类:根据"对象"抽象出"类"(例:
class Dog { }) - 发现类的属性:只保留与业务相关的属性(例:
String name = "旺财"; int health = 100; int love = 0; String strain = "拉布拉多犬";) - 发现类的方法:只保留与业务相关的方法(例:
public void print() { })
类图简单介绍
- 作用:用于分析和设计"类",直观易理解
- 组成:类名、属性(类型)、方法(返回值类型、参数:名字:类型)
- 访问修饰符:
+表示 public,-表示 private
2. 构造方法及其重载
对象初始化
- 可通过构造方法在创建对象时直接完成赋值
构造方法语法
- 系统默认提供无参构造方法:
public Penguin() { }
构造方法重载(自定义构造方法)
- 核心要求:方法名相同,参数数据类型或参数个数不同
- 与返回值、访问修饰符无关
- 示例:
// 无参构造 |
3. static 关键字介绍
静态变量与静态方法
- 静态变量:
static final String SEX_MALE="Q 仔";(用类名调用:Penguin.SEX_MALE) - 静态方法:
static void print() { }(用类名调用:Penguin.print()) - final 修饰的变量为常量,值固定不变
static 与非 static 修饰的区别
| 对比项 | static、非 private 修饰 | 非 static、private 修饰 |
|---|---|---|
| 属性 | 类属性、类变量 | 实例属性、实例变量 |
| 方法 | 类方法 | 实例方法 |
| 调用方式 | 类名。方法 ()、对象。方法 ()、类名。属性、对象。属性 | 对象。方法 ()、对象。属性 |
| 归属 | 类 | 单个对象 |
4. 封装的概念及其使用
封装的目的
- 解决属性随意访问导致的不合理赋值问题(例:
Dog d = new Dog(); d.health = -1000;)
封装的定义
- 面向对象三大特征之一,将类的某些信息隐藏在类内部,不允许外部直接访问,通过类提供的方法操作和访问隐藏信息
封装的好处
- 隐藏类的实现细节
- 只能通过规定方法访问数据
- 方便加入控制语句
- 方便修改实现
封装的步骤
-
修改属性的可见性,设为 private
-
创建公有的 getter/setter 方法,用于属性的读写
-
在 getter/setter 方法中加入属性控制语句,对属性值的合法性进行判断
代码示例
private int health; |
- 添加 getter/setter 方法的快捷键:Shift+Alt+S+R
this 用法
- 调用属性:
this.health = 100; this.name = "大黄"; - 调用方法:
this.print(); - 调用构造方法:
this(); this("小黑",100,100,"雄");(必须是构造方法中的第一条语句)
5. 类的实现示例
Dog 类
class Dog { |
Penguin 类
public class Penguin { |
课时二 继承
1. 继承的优点和实现
继承的目的
- 解决代码冗余问题,将重复代码抽取到父类中
继承的核心关系
- 子类与父类是 is-a 关系(例:Dog is a Pet)
继承的语法
- 编写父类:
class Pet { |
- 编写子类(单继承):
class Dog extends Pet { |
子类访问父类成员
- 访问父类构造方法:
super();、super(name);(必须是子类构造方法的第一句) - 访问父类属性:
super.name; - 访问父类方法:
super.print();
不能被继承的父类成员
- private 成员
- 子类与父类不在同包,使用默认访问权限的成员
- 构造方法
访问修饰符 protected
- 可以修饰属性和方法
- 本类、同包、子类可以访问
访问修饰符总结
| 访问修饰符 | 本类 | 同包 | 子类 | 其他 |
|---|---|---|---|---|
| private | √ | |||
| 默认 (friendly) | √ | √ | ||
| protected | √ | √ | √ | |
| public | √ | √ | √ | √ |
多重继承关系的初始化顺序
- 父类属性
- 父类构造方法
- 子类属性
- 子类构造方法
2. 子类重写父类方法
构造方法不可重写
- 构造方法不能被继承,因此不能重写
方法重写的规则
- 方法名相同
- 参数列表相同
- 返回值类型相同或者是其子类
- 访问权限不能严于父类
方法重载与方法重写的区别
| 对比项 | 方法重写 | 方法重载 |
|---|---|---|
| 位置 | 子类 | 同类 |
| 方法名 | 相同 | 相同 |
| 参数表 | 相同 | 不相同 |
| 返回值 | 相同或是其子类 | 无关 |
| 访问修饰符 | 不能比父类更严格 | 无关 |
super 关键字的使用限制
- 只能出现在子类的方法和构造方法中
- 调用构造方法时,只能是第一句
- 不能访问父类的 private 成员
3. 抽象类和抽象方法
抽象类的目的
- 限制实例化(例:
Pet pet = new Pet("贝贝",20,40);无意义)
抽象类的语法
public abstract class Pet { |
抽象方法的规则
- 抽象方法没有方法体
- 抽象方法必须在抽象类里
- 抽象方法必须在子类中被实现,除非子类是抽象类
4. final 修饰符
final 修饰类
- 类不能再被继承(例:
public final class Penguin extends Pet { })
final 修饰方法
- 方法不能被子类重写(例:
public final void print() { })
final 修饰变量
- 变量变成常量,只能在初始化时赋值(例:
final String home="南极";,不可再赋值)
5. 继承实现示例
人类与学生类(继承 + 重写)
package homework.extend.java; |
课时三 多态
1. 多态的优势和应用场合
多态的目的
- 解决代码扩展性差的问题(例:新增宠物类型无需修改主人类喂食方法)
多态的定义
- 同一个引用类型,使用不同的实例而执行不同操作
- 核心:父类引用指向子类对象
实现多态的三个要素
- 具有继承关系的父类和子类
- 子类重写父类方法
- 使用父类的引用指向子类的对象(向上转型,自动类型转换)
向上转型示例
Pet pet = new Dog(); // 自动类型转换 |
2. 使用父类作为方法形参实现多态
优化主人喂食方法
// 父类 Pet |
3. 使用父类作为方法返回值实现多态
实现领养宠物功能
public class Master{ |
4. 父类到子类转换
向下转型(强制类型转换)
- 父类引用不能直接调用子类特有方法,需强制转换为子类类型
- 示例:
Pet pet = new Dog("欧欧","雪纳瑞"); |
instanceof 运算符
- 语法:
对象 instanceof 类或接口 - 作用:判断对象是否为指定类或接口的实例,避免转型错误
- 示例:
public class Master { |
5. 多态实现示例(动物叫声)
// 抽象父类 Animal |
课时四 接口
1. 接口基础知识
接口的使用场景
- 解决 Java 单继承限制(例:防盗门需要继承门,同时具备锁的功能)
接口的语法
public interface 接口名 { |
接口的特性
- 接口不能被实例化,仅作为类型使用
- 实现类必须实现接口的所有抽象方法(除非实现类是抽象类)
- 一个类可以实现多个接口(Java 间接实现多继承)
- 接口中的成员变量默认是
public static final,方法默认是public abstract
USB 接口示例
1. 定义 USB 接口
public interface UsbInterface { |
2. 实现类(U 盘、USB 鼠标)
// U盘实现 |
3. 使用接口(多态)
public class Test { |
2. 接口表示一种能力
核心思想
- 接口是一种 “能力” 的约定,不关心实现者是谁,只关心是否具备该能力
- 例:“钳工” 是一种能力,无论是谁,只要具备该能力就能完成对应工作
面向接口编程的优势
- 解耦:设计与实现分离
- 灵活:支持多实现,便于扩展
- 多态:天然支持多态调用
3. 接口应用示例(防盗门)
1. 定义抽象类 Door(门的基础功能)
public abstract class Door { |
2. 定义接口 Lock(锁的功能)
public interface Lock { |
3. 定义接口 Bell(门铃功能)
public interface Bell { |
4. 防盗门实现(继承 + 多接口)
public class TheftproofDoor extends Door implements Lock, Bell { |
5. 测试类
public class Test { |
4. 接口应用示例(计算器)
// 定义计算接口 |
课时五 异常
1. 异常的概念
异常的定义
- 程序运行过程中发生的不正常事件(如除零、数组越界),会中断程序执行
异常处理的关键字
try:包裹可能产生异常的代码块catch:捕获并处理异常finally:无论是否发生异常,都会执行(除非调用System.exit(1))throw:手动抛出异常对象throws:声明方法可能抛出的异常类型
2. try-catch-finally 处理异常
基本语法
try { |
示例(除法异常处理)
import java.util.Scanner; |
finally 执行规则
- 无论 try 块是否发生异常、catch 块是否执行、是否有 return,finally 都会执行
- 唯一不执行的情况:
System.exit(1)(终止虚拟机)
3. throw 与 throws 抛出异常
throws 声明异常
- 语法:
方法返回值类型 方法名() throws 异常类型1, 异常类型2 { } - 作用:声明方法可能抛出的异常,由调用者处理
- 示例:
public static void divide(int num1, int num2) throws ArithmeticException { |
throw 手动抛出异常
- 语法:
throw new 异常类型("异常信息"); - 作用:在满足特定条件时,主动抛出异常
- 示例:
public class Person { |
4. 异常的分类
异常层次结构
Throwable(所有异常/错误的父类) |
常见异常类型
| 异常类型 | 说明 |
|---|---|
| ArithmeticException | 算术错误(如除零) |
| ArrayIndexOutOfBoundsException | 数组下标越界 |
| NullPointerException | 访问 null 对象成员 |
| ClassNotFoundException | 无法加载指定类 |
| InputMismatchException | 输入类型不匹配 |
| ClassCastException | 类型转换错误 |
| NumberFormatException | 数字格式转换错误(如 “abc” 转 int) |
5. 异常处理示例
示例 1:输入 5 个整数(处理输入不匹配和数组越界)
import java.util.Scanner; |
示例 2:判断三角形(自定义异常)
// 自定义异常类 |
6. 使用 log4j 记录日志
log4j 作用
- 记录程序运行日志(包括异常信息、关键操作),支持输出到控制台、文件
- 控制日志级别(fatal > error > warn > info > debug)
使用步骤
- 导入 log4j 的 JAR 包
- 创建 log4j.properties 配置文件
- 在代码中使用 log4j 记录日志
log4j 配置文件(log4j.properties)
# 设置日志级别和输出目的地(控制台+文件) |
代码中使用 log4j
import org.apache.log4j.Logger; |
课时六 集合
1. 集合框架概述
集合的作用
- 存储数量不确定的对象
- 支持复杂的对象存储方式(如键值映射)
- 位于
java.util包中
核心接口关系
Collection(集合根接口) |
核心接口特性
| 接口 | 特性 | 常用实现类 |
|---|---|---|
| List | 有序、可重复、有索引 | ArrayList、LinkedList |
| Set | 无序、不可重复 | HashSet、TreeSet |
| Map | 键值对、键唯一、值可重复 | HashMap、TreeMap |
2. ArrayList 和 LinkedList 的使用
ArrayList(数组实现)
常用方法
| 方法 | 说明 |
|---|---|
add(E e) |
在末尾添加元素 |
add(int index, E e) |
在指定索引添加元素 |
get(int index) |
获取指定索引元素 |
remove(int index) |
删除指定索引元素 |
size() |
获取元素个数 |
contains(Object o) |
判断是否包含指定元素 |
示例
import java.util.ArrayList; |
LinkedList(链表实现)
特有方法(操作首尾元素)
| 方法 | 说明 |
|---|---|
addFirst(E e) |
在首部添加 |
addLast(E e) |
在尾部添加 |
getFirst() |
获取首部元素 |
getLast() |
获取尾部元素 |
removeFirst() |
删除首部元素 |
removeLast() |
删除尾部元素 |
示例
import java.util.LinkedList; |
3. HashMap 的使用(键值映射)
常用方法
| 方法 | 说明 |
|---|---|
put(K key, V value) |
存储键值对(键重复则覆盖值) |
get(Object key) |
根据键获取值(无此键返回 null) |
remove(Object key) |
根据键删除键值对 |
size() |
获取键值对个数 |
keySet() |
获取所有键的集合 |
values() |
获取所有值的集合 |
containsKey(Object key) |
判断是否包含指定键 |
示例
import java.util.HashMap; |
4. Iterator 的使用(迭代器遍历)
迭代器常用方法
| 方法 | 说明 |
|---|---|
hasNext() |
判断是否有下一个元素 |
next() |
获取下一个元素 |
remove() |
删除当前元素 |
示例(遍历 List)
import java.util.ArrayList; |
5. 泛型集合
泛型的作用
- 限定集合中元素的类型,避免类型转换异常
- 编译时检查类型,提高代码安全性
语法
// 泛型 List(只能存储 String 类型) |
示例
import java.util.ArrayList; |
6. 集合应用示例
示例 1:筛选数组中≥10 的数字存入集合
import java.util.ArrayList; |
示例 2:TreeSet 存储学生(按成绩排序)
import java.util.TreeSet; |
课时七 多线程
1. 线程的概念
进程与线程的区别
| 对比项 | 进程 | 线程 |
|---|---|---|
| 定义 | 应用程序的执行实例 | 进程中最小的执行单位 |
| 资源 | 有独立的内存空间和资源 | 共享进程的内存空间和资源 |
| 调度 | 操作系统调度的基本单位 | CPU 调度的基本单位 |
多线程的优势
- 充分利用 CPU 资源(多任务并发)
- 简化编程模型
- 提升用户体验(如后台加载数据不阻塞界面)
主线程
main()方法是主线程的入口- 主线程是其他子线程的父线程
- 主线程最后执行完毕(负责资源清理)
2. 线程的创建和启动
方式 1:继承 Thread 类
步骤
- 继承
java.lang.Thread类 - 重写
run()方法(线程执行体) - 创建线程对象,调用
start()方法启动(不能直接调用run())
示例
public class MyThread extends Thread { |
方式 2:实现 Runnable 接口
步骤
- 实现
java.lang.Runnable接口 - 实现
run()方法(线程执行体) - 创建
Thread对象,传入Runnable实例,调用start()启动
示例
public class MyRunnable implements Runnable { |
两种方式对比
| 对比项 | 继承 Thread 类 | 实现 Runnable 接口 |
|---|---|---|
| 优点 | 编写简单,直接操作线程 | 避免单继承限制,便于共享资源 |
| 缺点 | 受单继承限制 | 需通过 Thread 对象操作线程 |
| 推荐场景 | 简单场景,无需共享资源 | 复杂场景,需共享资源 |
3. 线程的状态
线程生命周期
- 创建状态:创建线程对象(
new Thread()) - 就绪状态:调用
start()后,等待 CPU 资源 - 运行状态:获得 CPU 资源,执行
run()方法 - 阻塞状态:因
sleep()、wait()等暂时停止执行 - 死亡状态:
run()执行完毕或调用stop()(不推荐)
状态转换触发条件
- 创建 → 就绪:
start()方法 - 就绪 → 运行:获得 CPU 时间片
- 运行 → 就绪:
yield()方法或时间片用完 - 运行 → 阻塞:
sleep(long millis)、wait()、suspend() - 阻塞 → 就绪:
sleep()超时、notify()、resume() - 运行 → 死亡:
run()执行完毕
4. 线程调度的常用方法
| 方法 | 说明 |
|---|---|
setPriority(int newPriority) |
设置线程优先级(1~10,默认 5,优先级高获取 CPU 概率大) |
static void sleep(long millis) |
线程休眠 millis 毫秒(进入阻塞状态,不释放锁) |
void join() |
等待该线程执行完毕(阻塞当前线程) |
static void yield() |
线程礼让(暂停当前线程,进入就绪状态,不释放锁) |
void interrupt() |
中断线程(如唤醒休眠的线程) |
boolean isAlive() |
判断线程是否处于活动状态 |
示例 1:线程优先级
public class PriorityTest implements Runnable { |
示例 2:线程休眠
public class SleepTest { |
示例 3:线程礼让
public class YieldTest implements Runnable { |
5. 线程的同步
线程安全问题
- 多个线程操作同一共享资源时,导致数据不一致(如多窗口购票超卖)
- 示例(不安全的购票):
// 票类(共享资源) |
同步解决线程安全
方式 1:同步方法(synchronized 修饰方法)
class Ticket { |
方式 2:同步代码块(synchronized 修饰代码块)
class Ticket { |
线程安全与非线程安全的类
| 非线程安全(效率高) | 线程安全(效率低) |
|---|---|
| ArrayList | Vector |
| HashMap | Hashtable、ConcurrentHashMap |
| StringBuilder | StringBuffer |
6. 多线程应用示例(安全购票)
// 票类(同步代码块实现安全售票) |
课时八 File I/O
1. File 类操作文件或目录
File 类的作用
- 操作文件或目录的属性(创建、删除、判断是否存在等)
- 不负责文件内容的读写
常用方法
| 方法 | 说明 |
|---|---|
exists() |
判断文件 / 目录是否存在 |
isFile() |
判断是否为文件 |
isDirectory() |
判断是否为目录 |
createNewFile() |
创建空文件(目录不存在则报错) |
mkdir() |
创建单级目录 |
mkdirs() |
创建多级目录 |
delete() |
删除文件或空目录 |
getName() |
获取文件 / 目录名称 |
getPath() |
获取相对路径 |
getAbsolutePath() |
获取绝对路径 |
length() |
获取文件长度(字节) |
示例
import java.io.File; |
2. 字节流读写文件
字节流分类
| 流类型 | 基类 | 常用实现类 | 用途 |
|---|---|---|---|
| 字节输入流 | InputStream | FileInputStream | 读取文件内容(文本 / 二进制) |
| 字节输出流 | OutputStream | FileOutputStream | 写入文件内容(文本 / 二进制) |
字节流读写文本文件示例
import java.io.FileInputStream; |
字节流拷贝二进制文件(如图片、音频)
import java.io.FileInputStream; |
3. 字符流读写文件
字符流分类
| 流类型 | 基类 | 常用实现类 | 用途 |
|---|---|---|---|
| 字符输入流 | Reader | FileReader、BufferedReader | 读取文本文件(避免中文乱码) |
| 字符输出流 | Writer | FileWriter、BufferedWriter | 写入文本文件(避免中文乱码) |
课时九 JDBC
1. JDBC 原理
JDBC 定义
- JDBC(Java Database Connectivity)是 Java 数据库连接技术,提供连接各类数据库的统一接口,位于
java.sql和javax.sql包中。
JDBC 架构
Java 应用程序 → JDBC API → JDBC DriverManager → JDBC 驱动 → 数据库服务器 |
核心组件及作用
| 组件 | 作用 |
|---|---|
| DriverManager | 管理 JDBC 驱动,建立数据库连接 |
| Connection | 负责与数据库建立连接,传递数据 |
| Statement | 执行 SQL 语句(静态 SQL) |
| PreparedStatement | 执行预编译 SQL 语句(避免 SQL 注入) |
| ResultSet | 保存查询语句的返回结果集 |
JDBC 操作步骤
- 加载 JDBC 驱动(数据库厂商提供)
- 建立数据库连接(通过 DriverManager.getConnection ())
- 创建 Statement/PreparedStatement 对象
- 执行 SQL 语句
- 处理结果集(查询操作)
- 释放资源(关闭 ResultSet、Statement、Connection)
2. 加载驱动与建立连接
加载驱动
- 纯 Java 驱动(推荐):
Class.forName("com.mysql.jdbc.Driver");(MySQL 5.x) - MySQL 8.x 驱动:
Class.forName("com.mysql.cj.jdbc.Driver");
建立连接(DriverManager.getConnection ())
- 语法:
Connection conn = DriverManager.getConnection(URL, 用户名, 密码); - MySQL URL 格式:
jdbc:mysql://localhost:3306/数据库名?useSSL=false&serverTimezone=UTC - 示例:
import java.sql.Connection; |
3. Statement 接口的使用
常用方法
| 方法 | 说明 |
|---|---|
ResultSet executeQuery(String sql) |
执行查询 SQL(SELECT),返回 ResultSet |
int executeUpdate(String sql) |
执行 DML(INSERT/UPDATE/DELETE)或 DDL,返回影响行数 |
boolean execute(String sql) |
执行任意 SQL,返回是否有 ResultSet |
void close() |
关闭 Statement 对象 |
执行查询示例(查询狗狗信息)
import java.sql.Connection; |
执行更新示例(修改狗狗健康值)
public class StatementUpdate { |
4. ResultSet 接口的使用
常用方法
| 方法 | 说明 |
|---|---|
boolean next() |
游标向下移动一行,返回是否有数据 |
int getInt(int colIndex) |
通过列号获取 int 类型数据(列号从 1 开始) |
int getInt(String colLabel) |
通过列名获取 int 类型数据 |
String getString(int colIndex) |
通过列号获取 String 类型数据 |
String getString(String colLabel) |
通过列名获取 String 类型数据 |
void close() |
关闭 ResultSet 对象 |
结果集处理说明
- 游标初始位置:在第一行数据之前
- 调用
next()后游标移动到下一行,返回true表示有数据,false表示到达末尾 - 支持通过列号或列名获取数据(推荐列名,可读性更强)
5. PreparedStatement 接口的使用
核心优势
- 预编译 SQL 语句,提高执行效率(适合重复执行的 SQL)
- 避免 SQL 注入攻击(通过占位符
?传递参数) - 代码可读性和可维护性更高
常用方法
| 方法 | 说明 |
|---|---|
void setInt(int parameterIndex, int x) |
为第 parameterIndex 个占位符设置 int 值 |
void setString(int parameterIndex, String x) |
为第 parameterIndex 个占位符设置 String 值 |
ResultSet executeQuery() |
执行查询(无参数,SQL 已预编译) |
int executeUpdate() |
执行更新(无参数,SQL 已预编译) |
void close() |
关闭 PreparedStatement 对象 |
避免 SQL 注入示例(用户登录)
import java.sql.Connection; |
执行批量插入示例
public class PreparedStatementBatch { |
6. JDBC 注意事项
- 资源释放:必须关闭 ResultSet、Statement/PreparedStatement、Connection,顺序从后往前
- 异常处理:所有 JDBC 操作必须捕获 SQLException
- 事务管理:默认自动提交,批量操作时可手动关闭自动提交,执行后提交事务,异常时回滚
- 驱动版本:MySQL 5.x 和 8.x 驱动类路径不同,需对应数据库版本
- SQL 注入:优先使用 PreparedStatement 替代 Statement,避免直接拼接 SQL 字符串
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 好的好的378的博客!
评论
