3405 字
17 分钟

Java-第二章-面向对象(上)

2026-03-08
浏览量 加载中...
Note

继Java基础语法后,我们正式进入Java核心特性——面向对象编程(OOP)的学习。面向对象是Java的灵魂,掌握对象、类、封装等核心概念,是理解后续复杂特性的关键!

面向对象编程(OOP)的核心思想是将现实世界中的事物抽象为程序中的 “对象”,通过封装、继承、多态等特性,让程序更贴近现实逻辑,也更易于维护和扩展。本节我们重点讲解面向对象的基础核心:对象和类、修饰符、构造方法、封装、this关键字。

对象和类#

现实世界中,“类”是对一类事物的抽象描述,“对象”是这类事物的具体实例。

1. 核心概念#

  • 类(Class):定义了对象的属性和行为,是创建对象的“模板”。
    • 属性:对应类的成员变量
    • 行为:对应类的方法
  • 对象(Object):类的具体实例,拥有类定义的所有属性和行为。

2. 语法规则#

(1)定义类

// 类名首字母大写,遵循驼峰命名法
public class 类名 {
// 成员变量(属性):定义在类中、方法外
数据类型 变量名1;
数据类型 变量名2;
返回值类型 方法名() {
// 方法体
}
}

(2)创建对象

// 格式:类名 对象名 = new 类名();
类名 对象名 = new 类名();
// 访问对象的属性和方法
对象名.成员变量名;
对象名.成员方法名();

示例

// 定义Person类
public class Person {
String name;
int age;
double height;
public void eat() {
System.out.println(name + "正在吃饭!");
}
public void speak() {
System.out.println("大家好,我是" + name + ",今年" + age + "岁!");
}
public static void main(String[] args) {
// 创建第一个Person对象
Person zhangsan = new Person();
zhangsan.name = "张三";
zhangsan.age = 20;
zhangsan.height = 1.75;
zhangsan.eat();
zhangsan.speak();
// 创建第二个Person对象
Person lisi = new Person();
lisi.name = "李四";
lisi.age = 22;
lisi.height = 1.80;
lisi.eat();
lisi.speak();
}
}

运行效果

张三正在吃饭!
大家好,我是张三,今年20岁!
李四正在吃饭!
大家好,我是李四,今年22岁!

修饰符#

Java修饰符用于限定类、变量、方法的访问权限和特性,核心分为访问修饰符非访问修饰符两类。

1. 访问修饰符#

控制类/变量/方法的“可见范围”,是封装的核心基础,共4种:

修饰符同一类中同一包中不同包的子类不同包的非子类常用场景
private×××类的成员变量、私有方法(封装)
default××同包内的类/方法/变量(默认)
protected×子类需要访问的成员
public对外提供的接口、主类

2. 非访问修饰符#

  • static:静态修饰符,修饰的变量/方法属于类本身,而非对象。
  • final:最终修饰符,修饰类则类不能被继承,修饰变量则变量值不可修改,修饰方法则方法不能被重写。
  • abstract:抽象修饰符,修饰抽象类/抽象方法。

示例

// 公共类:可被所有包访问
public class ModifierDemo {
// 私有成员变量:仅本类可访问
private String privateVar = "私有变量";
// 默认修饰符:同包可访问
String defaultVar = "默认变量";
// 受保护变量:同包+子类可访问
protected String protectedVar = "受保护变量";
// 公共变量:所有地方可访问
public String publicVar = "公共变量";
// 静态变量:属于类,所有对象共享
public static String staticVar = "静态变量";
// 最终常量:值不可修改
public final String FINAL_VAR = "最终常量";
// 私有方法:仅本类可调用
private void privateMethod() {
System.out.println("调用私有方法:" + privateVar);
}
// 公共方法:对外提供访问私有成员的接口
public void accessPrivate() {
privateMethod(); // 本类内可调用私有方法
}
public static void main(String[] args) {
ModifierDemo demo = new ModifierDemo();
// 访问不同修饰符的变量
System.out.println(demo.defaultVar);
System.out.println(demo.protectedVar);
System.out.println(demo.publicVar);
// 访问静态变量
System.out.println(ModifierDemo.staticVar);
// 访问最终常量
System.out.println(demo.FINAL_VAR);
// 调用公共方法访问私有成员
demo.accessPrivate();
}
}

运行效果

默认变量
受保护变量
公共变量
静态变量
最终常量
调用私有方法:私有变量

构造方法#

构造方法(构造器)是创建对象时自动调用的特殊方法,用于初始化对象的属性。

1. 核心规则#

  1. 构造方法名必须与类名完全相同
  2. 构造方法没有返回值类型
  3. 若类中未定义构造方法,Java会自动提供一个无参默认构造方法
  4. 若定义了构造方法,默认构造方法会失效。
  5. 构造方法支持重载

2. 语法规则#

// 无参构造方法
public 类名() {
// 初始化逻辑
}
// 有参构造方法
public 类名(参数类型1 参数名1, 参数类型2 参数名2) {
// 给成员变量赋值
this.参数名1 = 参数名1;
this.参数名2 = 参数名2;
}

示例

public class ConstructorDemo {
String name;
int age;
// 无参构造方法
public ConstructorDemo() {
System.out.println("调用无参构造方法,初始化对象!");
this.name = "未知姓名";
this.age = 0;
}
// 有参构造方法
public ConstructorDemo(String name, int age) {
System.out.println("调用有参构造方法,初始化对象!");
this.name = name;
this.age = age;
}
public void showInfo() {
System.out.println("姓名:" + name + ",年龄:" + age);
}
public static void main(String[] args) {
// 使用无参构造创建对象
ConstructorDemo obj1 = new ConstructorDemo();
obj1.showInfo();
// 使用有参构造创建对象
ConstructorDemo obj2 = new ConstructorDemo("张三", 20);
obj2.showInfo();
}
}

运行效果

调用无参构造方法,初始化对象!
姓名:未知姓名,年龄:0
调用有参构造方法,初始化对象!
姓名:张三,年龄:20

封装#

封装是面向对象的三大特性之一(封装、继承、多态),核心思想是:将对象的属性私有化,仅通过公共方法(getter/setter)访问和修改,隐藏内部实现细节,保证数据安全性。

1. 封装的实现步骤#

  1. 将类的成员变量用 private 修饰,使其私有化。
  2. 提供公共的 getXxx() 方法(获取属性值)和 setXxx() 方法。
  3. 在setter方法中可添加数据校验逻辑,保证数据的合法性。

示例

public class EncapsulationDemo {
private String name;
private int age;
// 无参构造
public EncapsulationDemo() {}
// 有参构造
public EncapsulationDemo(String name, int age) {
this.setName(name);
this.setAge(age);
}
// getName():获取姓名
public String getName() {
return name;
}
// setName():设置姓名
public void setName(String name) {
if (name != null && !name.isEmpty()) {
this.name = name;
} else {
System.out.println("姓名不能为空!");
this.name = "默认姓名";
}
}
// getAge():获取年龄
public int getAge() {
return age;
}
// setAge():设置年龄
public void setAge(int age) {
if (age >= 0 && age <= 150) {
this.age = age;
} else {
System.out.println("年龄不合法(0-150)!");
this.age = 0;
}
}
// 展示信息
public void showInfo() {
System.out.println("姓名:" + name + ",年龄:" + age);
}
public static void main(String[] args) {
EncapsulationDemo person = new EncapsulationDemo();
person.setName("");
person.setAge(200);
person.showInfo();
person.setName("李四");
person.setAge(25);
person.showInfo();
// 使用有参构造创建对象
EncapsulationDemo person2 = new EncapsulationDemo(null, -5);
person2.showInfo();
}
}

运行效果

姓名不能为空!
年龄不合法(0-150)!
姓名:默认姓名,年龄:0
姓名:李四,年龄:25
姓名不能为空!
年龄不合法(0-150)!
姓名:默认姓名,年龄:0

this关键字#

this 代表当前对象的引用,主要用于解决变量命名冲突、调用构造方法、访问当前对象的成员。

1. this的核心用法#

用法场景说明
this.成员变量区分成员变量和局部变量
this.成员方法()调用当前对象的成员方法
this(参数)在构造方法中调用本类的其他构造方法(必须是第一行)

示例

public class ThisDemo {
private String name;
private int age;
// 无参构造
public ThisDemo() {
// 调用有参构造(this(参数)必须是第一行)
this("默认姓名", 0);
System.out.println("调用无参构造方法");
}
// 有参构造
public ThisDemo(String name, int age) {
this.name = name;
this.age = age;
System.out.println("调用有参构造方法");
}
// 成员方法:使用this调用其他方法
public void showInfo() {
this.print();
System.out.println("姓名:" + this.name + ",年龄:" + this.age);
}
public void print() {
System.out.println("=== 个人信息 ===");
}
public static void main(String[] args) {
// 创建对象1:调用无参构造
ThisDemo obj1 = new ThisDemo();
obj1.showInfo();
// 创建对象2:调用有参构造
ThisDemo obj2 = new ThisDemo("王五", 30);
obj2.showInfo();
}
}

运行效果

调用有参构造方法
调用无参构造方法
=== 个人信息 ===
姓名:默认姓名,年龄:0
调用有参构造方法
=== 个人信息 ===
姓名:王五,年龄:30

代码块#

1. 核心概念#

  • 代码块:用{}包裹的一段代码,是执行特定功能的代码区域,Java中根据位置和修饰符分为:局部代码块构造代码块静态代码块

  • 核心作用:初始化数据、隔离代码作用域、统一执行初始化逻辑。

2. 分类与语法规则#

(1)局部代码块

定义在方法内部,用于限制变量作用域,执行完后变量立即释放,节省内存。

public class Test {
public static void main(String[] args) {
// 局部代码块
{
int num = 10; // 仅在代码块内有效
System.out.println(num);
}
// System.out.println(num); 报错,超出作用域
}
}

(2)构造代码块(成员代码块)

定义在类中、方法外每次创建对象时都会执行,优先于构造方法执行,用于抽取所有构造方法的公共初始化逻辑。

public class 类名 {
// 构造代码块
{
// 初始化代码
}
// 构造方法
public 类名(){
}
}

(3)静态代码块

static修饰,定义在类中、方法外类加载时执行一次,优先于所有代码执行,用于加载驱动、初始化静态资源。

public class 类名 {
// 静态代码块
static {
// 静态资源初始化代码
}
}

3. 执行优先级总结#

静态代码块 > 构造代码块 > 构造方法 > 局部代码块

  • 静态代码块:只执行1次(类加载时)

  • 构造代码块:每创建一个对象,执行1次

示例

public class CodeBlockDemo {
// 1. 静态代码块:类加载时执行,只执行1次
static {
System.out.println("① 静态代码块执行");
}
// 2. 构造代码块:每次创建对象都会执行
{
System.out.println("② 构造代码块执行");
}
// 构造方法
public CodeBlockDemo() {
System.out.println("③ 构造方法执行");
}
public static void main(String[] args) {
// 3. 局部代码块:方法内,限制变量作用域
{
System.out.println("局部代码块执行");
}
// 创建第一个对象
System.out.println("\n--- 创建第一个对象 ---");
new CodeBlockDemo();
// 创建第二个对象
System.out.println("\n--- 创建第二个对象 ---");
new CodeBlockDemo();
}
}

运行效果

① 静态代码块执行
局部代码块执行
--- 创建第一个对象 ---
② 构造代码块执行
③ 构造方法执行
--- 创建第二个对象 ---
② 构造代码块执行
③ 构造方法执行

static关键字#

1. 核心概念#

  • static(静态):是修饰符,用于修饰类的成员(成员变量、方法、代码块、内部类)。

  • 核心特点:被static修饰的资源属于类本身,不属于单个对象,优先于对象加载,所有对象共享一份。

2. 语法规则#

(1)静态成员变量

  • 定义:static 数据类型 变量名;

  • 调用:类名.变量名(推荐),也可以用对象名调用

  • 特点:所有对象共享同一个值

(2)静态方法

  • 定义:public static 返回值类型 方法名(){}

  • 调用:类名.方法名()(推荐)

  • 注意:静态方法只能直接访问静态成员,不能访问非静态成员;静态方法中不能用this关键字

(3)静态代码块

上文已介绍,类加载时执行一次。

示例

public class StaticDemo {
// 普通成员变量(属于对象)
String name;
// 静态成员变量(属于类,所有对象共享)
static String school = "第一中学";
// 普通方法
public void showInfo() {
System.out.println("姓名:" + name + ",学校:" + school);
}
// 静态方法
public static void showSchool() {
// 静态方法只能访问静态成员
System.out.println("学校统一为:" + school);
}
public static void main(String[] args) {
// 静态方法:直接用 类名.方法名() 调用
StaticDemo.showSchool();
// 创建对象1
StaticDemo s1 = new StaticDemo();
s1.name = "小明";
s1.showInfo();
// 创建对象2
StaticDemo s2 = new StaticDemo();
s2.name = "小红";
s2.showInfo();
// 修改静态变量(所有对象共享)
StaticDemo.school = "实验中学";
System.out.println("\n修改学校后:");
s1.showInfo();
s2.showInfo();
}
}

运行效果

学校统一为:第一中学
姓名:小明,学校:第一中学
姓名:小红,学校:第一中学
修改学校后:
姓名:小明,学校:实验中学
姓名:小红,学校:实验中学

总结#

  1. 类与对象:类是对象的模板,对象是类的具体实例;创建对象的核心是 new 类名()

  2. 修饰符:访问修饰符控制可见范围,static修饰类成员,final修饰不可变元素。

  3. 构造方法:与类名同名、无返回值,用于初始化对象,支持重载,无自定义构造时Java提供默认无参构造。

  4. 封装:核心是private私有化属性,通过getter/setter访问修改,可添加数据校验保证安全性。

  5. this关键字:代表当前对象,用于区分重名变量、调用本类构造方法/成员方法。

  6. 代码块:静态代码块(类加载执行1次)、构造代码块(创建对象执行)、局部代码块(限制变量作用域)。

  7. static关键字:修饰的资源属于类、共享、优先加载,推荐用类名.成员调用,静态方法不能直接访问非静态资源。

  8. 执行顺序:静态代码块 → 局部代码块 → 构造代码块 → 构造方法。

支持与分享

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

赞助
Java-第二章-面向对象(上)
https://blog.pigeons2023.asia/posts/20260308/
作者
Pigeons2023
发布于
2026-03-08
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
Pigeons2023
不曾与你分享的时间,我在进步.
公告
欢迎光临我的博客 🎉 ,这里会分享我的日常和学习中的收集、整理及总结,希望能对你有所帮助:) 💖
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
19
分类
4
标签
6
总字数
62,837
运行时长
0
最后活动
0 天前

目录