Java-第二章-面向对象(上)
继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. 核心规则
- 构造方法名必须与类名完全相同。
- 构造方法没有返回值类型。
- 若类中未定义构造方法,Java会自动提供一个无参默认构造方法。
- 若定义了构造方法,默认构造方法会失效。
- 构造方法支持重载。
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. 封装的实现步骤
- 将类的成员变量用
private修饰,使其私有化。 - 提供公共的
getXxx()方法(获取属性值)和setXxx()方法。 - 在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)!姓名:默认姓名,年龄:0this关键字
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(); }}运行效果
学校统一为:第一中学姓名:小明,学校:第一中学姓名:小红,学校:第一中学
修改学校后:姓名:小明,学校:实验中学姓名:小红,学校:实验中学总结
-
类与对象:类是对象的模板,对象是类的具体实例;创建对象的核心是
new 类名()。 -
修饰符:访问修饰符控制可见范围,static修饰类成员,final修饰不可变元素。
-
构造方法:与类名同名、无返回值,用于初始化对象,支持重载,无自定义构造时Java提供默认无参构造。
-
封装:核心是private私有化属性,通过getter/setter访问修改,可添加数据校验保证安全性。
-
this关键字:代表当前对象,用于区分重名变量、调用本类构造方法/成员方法。
-
代码块:静态代码块(类加载执行1次)、构造代码块(创建对象执行)、局部代码块(限制变量作用域)。
-
static关键字:修饰的资源属于类、共享、优先加载,推荐用
类名.成员调用,静态方法不能直接访问非静态资源。 -
执行顺序:静态代码块 → 局部代码块 → 构造代码块 → 构造方法。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!