基本
特点概述:
封装:封装是将对象的属性和行为封装起来,不需要让外界知道具体实现细节;
继承:继承是可以在无需重新编写原有类的情况下,对原有类的功能进行扩展;
多态:多态指的是在一个类中定义的属性和功能被其他类继承后,当把子类对象直接赋值给父类引用变量时,相同引用类型的变量调用同一个方法所呈现出的多种不同行为特性。 技术平台:Java EE、Java SE、Java ME
Java组成:JDK > JRE > JVM
- JDK = JRE + 开发工具集(javac 编译器、javadoc、jdb 调试器等);开发工具包(用于开发)
- JRE = JVM + Java标准类库;运行时环境(用于运行)
- JVM = 虚拟机(实际执行代码) Java执行过程:编写代码、编译、加载、验证、执行
javac命令把.java源文件编译成.class字节码文件,然后用java命令启动 JVM(Java虚拟机),JVM 通过类加载器加载.class文件,再由解释器或 JIT 编译器将字节码转为机器码执行。 数据类型:基本数据类型、引用数据类型(类/接口/数组/枚举) JVM(Java Virtual Machine)、JDK(Java Development Kit)、JRE(Java Runtime Environment)
命名规范
类:单词首字母大写。
变量/方法:从第二个单词起大写。
包:全小写。
类中方法外定义的变量称为字段(Field)
构造方法
一次性完成字段初始化
方法名和类名相同、无返回值类型声明
方法中不能用return 返回值,但可单独写return语句来作为方法的结束。
没有自定义构造方法时,JVM提供一个默认的无参构造方法
只有实例类才有构造器,接口和抽象类没有
Class(参数列表){//方法名和类名相同 this.属性=参数;}//无返回值
Class name=new Class(参数列表);static
| 维度 | static (静态/类成员) | 非static (实例成员) |
|---|---|---|
| 1. 归属主体 | 属于类本身 | 属于类的实例对象 |
| 2. 内存分配 | 类加载时分配在方法区 | 对象创建时分配在堆内存 |
| 3. 内存共享 | 所有对象共享同一份内存 | 每个对象独立内存 |
| 4. 生命周期 | 类加载 → 程序结束 | 对象创建 → 对象GC回收 |
| 5. 调用方式 | 类名.成员名 | 对象.成员名 |
| 6. this/super(方法/代码块) | 不能使用 | 可以使用 |
| 7. 访问限制(方法/代码块) | 只能访问静态成员 | 可访问静态+实例成员 |
| 8. 多态性 | 没有多态(只能隐藏) | 支持多态(可重写) |
| 9. 同步锁 | 使用类锁 (Class对象) | 使用对象锁 (this) |
| 10. 初始化时机 | 类加载时(静态块/声明时) | 对象创建时(构造块/声明时) |
| 11. 典型应用 | 工具方法、常量、单例、计数器 | 对象属性、业务方法、状态操作 |
初始化顺序: 父类静态块 → 子类静态块 → 父类实例变量/构造块 → 父类构造器 → 子类实例变量/构造块 → 子类构造器。(级别相同按先后顺序)
封装
实现:用 private 修饰成员变量,通过 public 的 getter/setter 方法访问。
目的:隐藏内部实现,只暴露必要接口,提高安全性和可维护性。
访问控制
private:只能在本类访问,不被子类继承和访问。default:同包可见。(无访问控制符)protected:同包或子类可见(推荐用于希望子类访问的成员)public:所有地方可见。- 子类的访问权限要比父类更公开、或相同。
- private > default > protected > public
继承
单继承:Java类只支持单继承(一个子类只能有一个直接父类),但可通过接口实现多继承效果。
关键字:用 extends 实现继承,如 class Child extends Parent。
继承内容:
- 子类继承父类的 非私有成员(字段、方法)。
- 构造器 不被继承,但子类构造器必须(隐式或显式)调用父类构造器。
private成员虽不可见,但依然被继承。
父类无构造方法?
- 若父类未定义任何构造方法,编译器会自动提供默认无参构造方法,子类可正常继承(隐式调用
super())。 - 若父类显式定义了任意构造方法(包括有参),则不再生成默认无参构造,此时子类必须显式调用
super(...),否则编译报错。
方法重写(Override)
- 可重写父类非
private、非final、非static的方法。 - 要求:方法名、参数列表、返回类型(协变)一致;访问权限不能更严格。
this 关键字
- 变量
this.attribute - 方法
this.method() - 构造方法
this() - 本类型
this
super 关键字
super():调用父类构造器,必须在子类构造器第一行。super.method()/super.field:访问父类成员。super()和this()都必须是构造方法中的第一条语句,所以不能同时出现在同一个构造方法中。- 父类先于子类实例化
final 限制
- 修饰类:不能被继承
- 修饰方法:不能被子类重写。
- 修饰的变量(成员变量和局部变量)是常量,只能赋值一次
Object 类:
- 所有类默认继承自
java.lang.Object - 定义类时,未指定他的父类默认继承Object类
toString()输出实例名自动调用该方法
public class Object { public String toString() { // 默认获取运行时的类的对象的类名@十六进制哈希码 return getClass().getName() + "@" + Integer.toHexString(hashCode()); }}多态
概念
-
Java多态:同一个引用,不同实现。
-
前提:继承 + 方法重写 + 父类引用指向子类对象。
-
表现:编译看左边(父类),运行看右边(实际子类)。
-
目的:提高代码扩展性和可维护性,便于统一处理不同子类。
-
静态多态(编译时多态):
- 通过 方法重载(Overload) 实现。
- 编译器在 编译期 根据参数类型、个数、顺序决定调用哪个方法。
- 与继承无关,同一个类或父子类中都可重载。
-
动态多态(运行时多态):
@Override注解提示编译器要检查- 通过 方法重写(Override) + 父类引用指向子类对象 实现。
- JVM 在 运行期 根据实际对象类型决定调用哪个方法。
- 必须有继承/实现关系,且方法不能是 private/static/final。
函数重载/重写
重写(Override)
- 指子类重新定义父类中已有的方法(方法名、参数列表、返回类型相同),以实现不同的行为。属于运行时多态。
- 子类和父类方法签名必须相同:方法名、参数列表、返回类型
- 子类访问权限不能比父类更低:可以相等或更宽松
- 父类方法:protected修饰 → 子类方法:protected或public ✓
- 父类方法:public修饰 → 子类方法:private ✗
- 不能抛出更宽泛的异常
重载(Overload)
- 指在同一个类中定义多个同名方法,但参数列表不同(参数类型、个数或顺序不同)。属于编译时多态。
- 参数列表不同体现在三个方面:参数类型不同、参数个数不同、参数顺序不同
- 返回值类型(仅返回值不同不构成重载)
- 核心原则:只看方法名和参数列表,其他都不看。 编译器通过参数列表的差异来决定调用哪个重载方法。
对象类型转换:
- 向上转型,将父类引用 -> 子类对象。无需强制转换,不能通过父类实例去调子类特有的方法
- 向下转型要 强制转换 最好用
instanceof
Animal animal = new Dog();
animal.eat(); // ✅ 可以调用(如果Dog重写了eat,执行Dog的版本)animal.bark(); // ❌ 编译错误!Animal类没有bark()方法
//需要向下转型才能调用//需要类型判断:`instanceof` 可以判断一个对象是否为某个类的实例if (animal instanceof Dog) { Dog dog = (Dog) animal; // 向下转型 dog.bark(); // ✅ 现在可以调用}构造函数重载
搭配this简化
public Car(String brand, String model, int year, String color) { this.brand = brand; this.model = model; this.year = year; this.color = color; } // 1 public Car(String brand, String model, int year) { this(brand, model, year, "白色"); } // 2 public Car(String brand, String model) { this(brand, model, 2023); } // 3 public Car(String brand) { this(brand, "未知型号"); } // 4 public Car() { this("未知品牌"); }// 调用构造函数4 -> 调用3 -> 调用2 -> 调用1 -> Car("未知品牌","未知型号",2023,"白色")// 简洁代码量的构造传递//即使我给定 形参数最少的构造方法 去实例化一个对象,但这个对象依然具有多个的默认属性。抽象类
包含
- 抽象方法 - (必须显示指定
public abstract) - 其余和普通类所包含一致 重点
- 抽象类不能被实例化,只能被继承
- 继承该抽象类必须实现抽象类的所有抽象方法
- 抽象类不一定包含抽象方法
- 可以包含成员变量、常量、构造方法(供子类调用)
抽象类 = 有部分实现的模板,需要子类补全; 普通类 = 已完成的功能,你继承它只是为了复用代码。
抽象类的意义是:让子类一定要干某件事(强制性规范)
接口
相关子类和不相关子类之间抽象出来都具有的行为(约束)。
弥补 了JAVA只能单继承类 ,一个类可以实现多个接口
- Java 7及之前:完全抽象,只能声明常量和抽象方法
- Java 8:引入默认方法(default)和静态方法
- Java 9:引入私有方法
包含
- 常量 - (默认 public static final)
- 抽象方法 - (默认 public abstract) (除该方法,其余均为具体方法)
- 静态方法
- 默认方法
- 私有方法
- 函数式接口
重点
- 接口也不能实例化,只能被继承
- 继承该接口的子类方法必须实现接口的所有抽象方法
- 默认访问权限是
public abstract(隐式可省) - 接口的所有非私有方法的访问控制权限 均是
public(隐式可省) - 当一个接口是
函数式接口时,只能包含一个抽象方法
抽象类实现接口时:
- 可以不实现接口里的抽象方法
- 前提是:它自己仍然是
abstract
Lambda表达式
使用函数式接口:
- 用
@FunctionalInterface注解,提醒编译器检查 - 只有1个抽象方法 定义
@FunctionalInterfacepublic interface A{ void add(int x,int y);}使用
// 1.基本使用(int x,int y)->{return x+y;}// 2.省略类型、编译器自动识别(x,y)->{return x+y;}// 3. 一条语句,大括号可以省;(int x,int y)->return x+y;// 4.1个return,return也可以省(int x,int y)-> x+y;// 5.都省(x,y)->x+y;//搭配使用A a = (x,y)-> x+y ;//相当于声明一个匿名类,这个表达式把抽象方法的具体实现定义了,并返回一个对象引用给aSystem.Out.println(a.add(3,4));内部类
#todo
String
特点
- 不可变性(Immutability)String对象一旦创建,其值就不能被修改;所有看似修改的操作都返回新的String对象;原对象在内存中保持不变
- String是final类型(const) 一单创建内容长度不变
- StringBuffer可以进行更改
Common Methods
| 方法 | 返回值类型 | 描述 |
|---|---|---|
| 查找相关 | ||
indexOf(String s) | int | 返回第一次找到指定字符串的起始索引 |
indexOf(String s, int fromIndex) | int | 从指定位置开始,返回第一次找到指定字符串的起始索引 |
lastIndexOf(String s) | int | 返回最后一次找到指定字符串的起始索引 |
lastIndexOf(String s, int fromIndex) | int | 从指定位置向前搜索,返回最后一次找到指定字符串的起始索引 |
| 字符访问 | ||
charAt(int index) | char | 返回指定索引处的字符 |
toCharArray() | char[] | 将字符串转换为字符数组 |
| 子字符串操作 | ||
substring(int start, int end) | String | 截取[start, end)范围的子字符串 |
substring(int start) | String | 截取从start到结尾的子字符串 |
| 字符串比较 | ||
equals(Object obj) | boolean | 比较字符串内容是否相等(严格比较) |
equalsIgnoreCase(String s) | boolean | 忽略大小写比较字符串内容 |
compareTo(String anotherString) | int | 按字典顺序比较字符串(区分大小写) |
compareToIgnoreCase(String str) | int | 按字典顺序比较字符串(忽略大小写) |
startsWith(String prefix) | boolean | 测试字符串是否以指定前缀开始 |
endsWith(String suffix) | boolean | 测试字符串是否以指定后缀结束 |
| 字符串连接 | ||
concat(String str) | String | 将指定字符串连接到此字符串的结尾 |
format(String format, Object... args) | String | 使用指定格式字符串和参数格式化字符串 |
join(CharSequence delimiter, CharSequence... elements) | String | 用指定分隔符连接多个字符串(静态方法) |
| 长度和修剪 | ||
length() | int | 返回字符串长度 |
trim() | String | 去除字符串两端的空白字符 |
strip() | String | 去除字符串两端的空白字符(Java 11+,支持更广泛的空白字符) |
isEmpty() | boolean | 检查字符串是否为空(长度是否为0) |
isBlank() | boolean | 检查字符串是否为空或仅包含空白字符(Java 11+) |
| 大小写转换 | ||
toLowerCase() | String | 将字符串转换为小写 |
toUpperCase() | String | 将字符串转换为大写 |
| 替换操作 | ||
replace(char oldChar, char newChar) | String | 替换字符串中的字符 |
replace(CharSequence target, CharSequence replacement) | String | 替换字符串中的子序列 |
replaceAll(String regex, String replacement) | String | 使用正则表达式替换所有匹配的子串 |
replaceFirst(String regex, String replacement) | String | 使用正则表达式替换第一个匹配的子串 |
| 拆分和转换 | ||
split(String regex) | String[] | 根据正则表达式拆分字符串 |
split(String regex, int limit) | String[] | 根据正则表达式拆分字符串,限制拆分次数 |
valueOf(Object obj) | String | 将各种类型的对象转换为字符串表示形式(静态方法) |
| 其他操作 | ||
repeat(int count) | String | 重复字符串指定次数(Java 11+) |
lines() | Stream<String> | 返回字符串中的行流(Java 11+) |
matches(String regex) | boolean | 判断字符串是否匹配给定的正则表达式 |
contains(CharSequence s) | boolean | 判断字符串是否包含指定的字符序列 |
toLowerCase(Locale locale) | String | 使用指定的Locale规则将字符串转换为小写 |
toUpperCase(Locale locale) | String | 使用指定的Locale规则将字符串转换为大写 |
StringBuffer
#todo
异常处理机制
异常
- 程序运行中,发生不正常的,破坏程序执行流程的事件;
类型
- 编译型异常(checked)
- 运行时异常(unchecked):编译器不检查,可处理;RuntimeException也是此类异常
异常类
| 异常类名称 | 异常原因 |
|---|---|
| ArithmeticException | 算数异常,如被零除发生的异常 |
| ArrayIndexOutOfBoundsException | 数组下标越界 |
| ArrayStoreException | 程序试图在数组中存储错误类型的数据 |
| ClassCastException | 类型强制转换异常 |
| IndexOutOfBoundsException | 当某对象的索引超出范围时抛出异常 |
| NegativeArraySizeException | 建立元素个数为负数的数组异常 |
| NullPointerException | 空指针异常 |
| NumberFormatException | 字符串转换为数字异常 |
| StringIndexOutOfBoundsException | 程序试图访问字符串中不存在的字符位置 |
| OutOfMemoryException | 分配给新对象的内存太少 |
| SocketException | 不能正常完成Socket操作 |
| ProtocolException | 网络协议有错误 |
| ClassNotFoundException | 未找到相应异常 |
| EOFException | 文件结束异常 |
| FileNotFoundException | 文件未找到异常 |
| IllegalAccessException | 访问某类被拒绝时抛出的异常 |
| InstantiationException | 试图通过newInstance()方法创建一个抽象类或抽象接口的实例时抛出该异常 |
| IOException | 输入输出异常 |
| NoSuchMethodException | 方法未找到异常 |
| SQLException | 操作数据库异常 |
异常处理
关键字
- try:放可能出错的代码
- catch:捕获特定类型的异常并处理
- finally:清理资源,一定会执行(除非 System.exit(0))
结构
- try……catch……finally结构
- try……with……resources结构
- throws
方法不靠谱时,可以设计向上一级函数抛出异常类
格式:方法名() throws 异常类列表
- throw手动抛出一个对象类
public void method() throws Exception{ if(...) {....} else{ throw new Exception("sth wrong here"); }}//这个方法可能会不符合程序设计需求,需要手动抛出一个异常,由上级函数捕获自定义异常类
#todo
部分信息可能已经过时