学习目标学会定义符合规范的 Java 类掌握类的实例化创建对象方法掌握通过对象引用访问对象属性 / 方法的规则理解 this 引用的含义和使用场景理解构造方法的作用、特性及重载掌握静态 / 非静态成员方法 / 变量的调用规则理解代码块的分类、作用及执行顺序一、先搞懂面向过程 vs 面向对象1. 核心区别面向过程关注 “做事的步骤”一步一步按流程来。面向对象关注 “参与的角色对象”让对象之间协作完成事情。2. 举个栗子洗衣服面向过程接水 → 2. 放洗衣粉 → 3. 放衣服 → 4. 搓洗 → 5. 漂洗 → 6. 拧干 → 7. 晾晒全程盯着 “步骤”少一步都不行面向对象角色对象人、衣服、洗衣粉、洗衣机。分工人把衣服和洗衣粉放进洗衣机 → 洗衣机完成清洗 → 人把衣服拿出来晾晒。全程盯着 “谁来做”不用关心洗衣机内部怎么转3. 面向对象核心三步找对象确定参与的角色→ 创建对象给角色赋予属性→ 使用对象让角色做事二、类对象的 “说明书”1. 认识类类是描述对象 “长什么样、能做什么” 的模板比如“学生类”描述学生有姓名、年龄属性能学习、考试行为“洗衣机类”描述洗衣机有容量、品牌属性能洗衣服、脱水行为。类比类 月饼模子对象 用模子压出来的月饼同一个模子能做多个月饼。2. 定义类新手必看规则核心规则类名用大驼峰每个单词首字母大写如Student、WashingMachine成员属性 / 方法前统一写public暂时记表示 “公开可访问”方法不加static暂时记加了就是 “类专属”没加是 “对象专属”。实战定义学生类// 学生类模板 public class Student { // 成员变量属性描述对象的特征 public String name; // 姓名 public int age; // 年龄 public double score;// 成绩 // 成员方法行为描述对象能做的事 public void study() { System.out.println(name 正在学习); } public void exam() { System.out.println(name 参加考试成绩 score); } }3. 类的实例化用模板造对象“实例化” 就是用类创建具体对象好比用月饼模子做出月饼。语法 示例public class Test { public static void main(String[] args) { // 1. new关键字创建对象实例化 Student stu1 new Student(); // 2. . 符号访问对象的属性/方法 stu1.name 张三; stu1.age 18; stu1.score 90.5; stu1.study(); // 输出张三正在学习 stu1.exam(); // 输出张三参加考试成绩90.5 // 3. 同一个类可以创建多个对象 Student stu2 new Student(); stu2.name 李四; stu2.age 19; stu2.study(); // 输出李四正在学习 } }三、前置知识三种变量类型定义位置访问方式示例局部变量方法内部直接用int num 10;成员变量类中、方法外对象。变量名stu1.name 张三静态变量类中、方法外加 static类名。变量名推荐Student.school 北大完整代码示例// 演示三种变量的区别 public class VariableDemo { // 1. 静态变量类变量类中、方法外加static // 特点属于类所有对象共享生命周期随类 public static String school 北京大学; // 2. 成员变量实例变量类中、方法外无static // 特点属于对象每个对象独有创建对象时初始化 public String name; // 成员方法演示三种变量的访问方式 public void showInfo(int age) { // 3. 局部变量方法内部包括方法参数 // 特点仅方法内可用必须手动初始化 int score 95; // 访问变量 // ① 访问局部变量直接用变量名 System.out.println(局部变量 age age); System.out.println(局部变量 score score); // ② 访问成员变量this.变量名或 对象.变量名 // this代表当前对象这里就是调用showInfo的对象 System.out.println(成员变量 name this.name); // ③ 访问静态变量类名.变量名推荐 或 this.变量名不推荐 System.out.println(静态变量 school VariableDemo.school); } // 主方法测试入口 public static void main(String[] args) { // 测试成员变量 // 创建第一个对象 VariableDemo stu1 new VariableDemo(); stu1.name 张三; // 成员变量每个对象单独赋值 stu1.showInfo(18); // 传入局部变量age18 // 创建第二个对象 VariableDemo stu2 new VariableDemo(); stu2.name 李四; // 成员变量和stu1的name互不影响 stu2.showInfo(19); // 传入局部变量age19 // 测试静态变量 // 静态变量通过类名修改所有对象都会受影响 VariableDemo.school 清华大学; System.out.println(\n修改静态变量后); stu1.showInfo(18); // 此时stu1的school也变成了清华大学 stu2.showInfo(19); // 局部变量注意事项 // 错误示例局部变量未初始化不能用注释掉才能运行 // int num; // System.out.println(num); // 编译报错变量num可能尚未初始化 } }运行结果局部变量 age 18 局部变量 score 95 成员变量 name 张三 静态变量 school 北京大学 局部变量 age 19 局部变量 score 95 成员变量 name 李四 静态变量 school 北京大学 修改静态变量后 局部变量 age 18 局部变量 score 95 成员变量 name 张三 静态变量 school 清华大学 局部变量 age 19 局部变量 score 95 成员变量 name 李四 静态变量 school 清华大学核心区别解读维度局部变量成员变量静态变量定义位置方法内部含参数类中、方法外无 static类中、方法外加 static所属对象仅属于当前方法属于具体对象每个对象独有属于类所有对象共享访问方式直接用变量名对象。变量名 /this. 变量名类名。变量名推荐初始化必须手动赋值才能用自动默认初始化0/null/false自动默认初始化也可静态代码块初始化生命周期方法执行时创建执行完销毁对象创建时创建对象销毁时销毁类加载时创建程序结束时销毁关键易错点总结局部变量方法里的临时变量用完就丢必须手动赋值比如age是方法参数调用时传值才初始化成员变量每个对象的“专属属性”比如张三和李四的name互不影响静态变量类的 “共享属性”修改一次所有对象都变比如school从北大改成清华后所有学生的学校都变了静态方法如main中不能直接访问成员变量因为成员变量属于对象静态方法不依赖对象但可以直接访问静态变量。四、this 引用对象的 “身份证”1. 为什么需要 this场景 1形参名和成员变量名重名分不清谁是谁// 不好的写法name到底是形参还是成员变量 public void setName(String name) { name name; // 错误把形参赋值给形参成员变量没变化 } // 正确写法this.name 成员变量name 形参 public void setName(String name) { this.name name; }场景 2多个对象调用同一个方法方法要知道 “服务谁”比如 stu1 和 stu2 都调用study()this 会自动指向调用方法的对象stu1 调用时 thisstu1stu2 调用时 thisstu2。2.this 的核心特性this 指向调用当前方法的对象只能在 “成员方法” 中用是成员方法的 “隐藏参数”编译器自动传递不用手动写。五、对象的构造与初始化1. 重载方法的 “同名不同参”好比去餐厅点餐“来份炒饭”无参、“来份加蛋的炒饭”一个参数、“来份加蛋加肠的炒饭”两个参数—— 都是 “炒饭”只是参数不同。// 重载示例方法名相同参数个数/类型不同 public class Student { public void eat() { System.out.println(吃饭); } public void eat(String food) { System.out.println(吃 food); } }2. 构造方法对象的 “出生证明”创建对象时自动调用给对象初始化属性一生只调用一次好比人只能出生一次。构造方法规则名字必须和类名完全一样没有返回值连 void 都不能写创建对象时编译器自动调用对象生命周期内只调一次可以重载多个构造方法参数不同不手动定义的话编译器自动生成无参构造方法构造方法中可通过this(...)调用其他构造方法必须是第一条语句绝大多数用 public 修饰特殊场景单例模式用 private。示例构造方法的使用public class Student { public String name; public int age; // 无参构造编译器自动生成写了就用自己的 public Student() { System.out.println(无参构造被调用); } // 有参构造重载 public Student(String name, int age) { this.name name; // 用this区分变量 this.age age; System.out.println(有参构造被调用); } } // 测试 public class Test { public static void main(String[] args) { Student stu1 new Student(); // 调用无参构造 Student stu2 new Student(张三, 18); // 调用有参构造 System.out.println(stu2.name); // 输出张三 } }3. 默认初始化为什么成员变量不用手动赋值局部变量是 “临时草稿纸”不用就丢所以必须手动赋值而成员变量是对象的 “专属特征”JVM 创建对象时会自动给成员变量赋默认值int0、Stringnull、booleanfalse好比买新手机出厂就自带默认设置。4. 就地初始化定义时直接赋值public class Student { public String name 未知姓名; // 就地初始化 public int age 18; // 就地初始化 }六、封装给对象 “套壳子”1. 封装的概念把对象的属性和方法 “打包”隐藏内部细节只对外暴露有限接口好比手机我们只用屏幕和按键不用关心内部电路板怎么工作。2. 访问限定符控制 “可见性”Java 用 4 种限定符控制谁能访问类 / 属性 / 方法限定符同类同包子类任意位置通俗理解private✔️❌❌❌私有的只有自己能看default✔️✔️❌❌默认的同包可见protected✔️✔️✔️❌受保护的子类也能看public✔️✔️✔️✔️公开的谁都能看3. 包类的 “文件夹”1. 包的作用管理类把相关的类放在同一个包好比把 “厨具” 放厨房、“衣服” 放衣柜避免重名不同包可以有同名类好比 “张三一班” 和 “张三二班” 不冲突。2. 常用操作导入包import java.util.Scanner;用别人写好的类自定义包IDEA 中右键 src → 新建 → 包 → 输入包名如com.example.student类文件最上方会自动生成package com.example.student;包名规则公司域名颠倒如百度域名www.baidu.com→ 包名com.baidu.xxx。七、static 成员类的 “共享资源”1. static 修饰成员变量静态变量属于类不是某个对象所有对象共享好比班级的 “班名”所有学生的班名都一样不用每个学生单独存。示例public class Student { public String name; // 成员变量每个学生都不一样 public static String school 北京大学; // 静态变量所有学生共享 public void show() { System.out.println(name 学校 school); } } // 测试 public class Test { public static void main(String[] args) { Student stu1 new Student(); stu1.name 张三; stu1.show(); // 输出张三学校北京大学 Student stu2 new Student(); stu2.name 李四; // 静态变量推荐用“类名.变量名”访问 Student.school 清华大学; stu2.show(); // 输出李四学校清华大学 stu1.show(); // 输出张三学校清华大学所有对象共享一个改全改 } }2. static 修饰成员方法静态方法属于类不用创建对象就能调用好比计算器的 “加法功能”不用先造一个计算器对象直接用。核心规则静态方法中不能直接用非静态成员变量 / 方法要用必须先 new 对象非静态方法中可以直接用静态成员推荐用 “类名。方法名” 调用如Math.random()。核心调用规则重点通过对象引用调用用于非静态成员变量 / 方法通过类名调用用于静态成员变量 / 方法推荐。静态方法中不能用任何非静态成员变量 / 方法要用必须 new 对象再通过对象访问非静态方法中可直接用静态成员变量 / 方法核心本质静态的不依赖于对象属于类不属于对象3. static 成员的初始化就地初始化public static int count 0;静态代码块专门初始化静态变量只执行一次类加载时执行。八、代码块初始化的 “补充手段”用{}包裹的代码按位置 / 修饰符分 3 类类型定义位置执行时机作用普通代码块方法内部调用方法时执行拆分复杂方法逻辑构造代码块类中无修饰符创建对象时执行早于构造方法初始化成员变量静态代码块类中加 static类加载时执行只执行一次初始化静态变量执行顺序静态代码块 → 构造代码块 → 构造方法public class Student { // 静态代码块 static { System.out.println(静态代码块执行); } // 构造代码块 { System.out.println(构造代码块执行); } // 构造方法 public Student() { System.out.println(构造方法执行); } } // 测试创建两个对象 public class Test { public static void main(String[] args) { Student stu1 new Student(); Student stu2 new Student(); } } // 输出 // 静态代码块执行只执行一次 // 构造代码块执行 // 构造方法执行 // 构造代码块执行 // 构造方法执行总结面向对象核心找对象→创对象→用对象类是模板对象是具体实例this 是对象的 “身份证”指向调用当前方法的对象解决变量重名和对象识别构造方法是对象 “出生凭证”一生只调一次可重载支持 this 调用其他构造封装是 “藏细节、露接口”靠访问限定符控制可见性包是类的 “文件夹”静态成员属于类、所有对象共享静态方法不能直接用非静态成员代码块执行顺序静态类加载→ 构造创对象→ 构造方法。