3711 字
10 分钟
Java 基础

基本#

特点概述:

封装:封装是将对象的属性和行为封装起来,不需要让外界知道具体实现细节;

继承:继承是可以在无需重新编写原有类的情况下,对原有类的功能进行扩展;

多态:多态指的是在一个类中定义的属性和功能被其他类继承后,当把子类对象直接赋值给父类引用变量时,相同引用类型的变量调用同一个方法所呈现出的多种不同行为特性。 技术平台:Java EEJava SEJava 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个抽象方法 定义
@FunctionalInterface
public 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 ;//相当于声明一个匿名类,这个表达式把抽象方法的具体实现定义了,并返回一个对象引用给a
System.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

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Java 基础
https://oddpalmer.space/posts/java基础/java/
作者
Oddpalmer
发布于
2026-01-22
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时