
一、面向对象核心概念1.1 基本思想将程序拆解为对象的集合每个对象是数据属性 行为方法的封装体。程序运行的本质是对象之间互相发送消息方法调用。1.2 三大特性特性说明类比封装隐藏内部实现细节仅暴露必要接口手机充电口对外内部电路隐藏继承子类复用父类的属性和方法减少重复代码大学生类继承学生类多态同一方法不同对象表现不同行为动物类叫()猫→喵、狗→汪二、类与对象2.1 概念对应概念Java 表述类属性static修饰的成员变量静态变量实例属性无static的成员变量实例方法无static的成员方法隐含this类方法static修饰的方法初始化方法构造方法与类同名无返回值2.2 完整代码示例学生类public class Student { // 1. 类属性静态变量所有对象共享 public static String species 人类; public static String school XX中学; // 2. 实例属性成员变量每个对象独有 private String stuId; private String name; private int age; private String grade; // 默认值 null // 3. 构造方法创建对象时初始化 public Student(String stuId, String name, int age) { this.stuId stuId; this.name name; this.age age; } // 4. 实例方法操作实例属性 public void attendClass(String course) { System.out.printf(%s学号%s正在上%s课%n, this.name, this.stuId, course); } // 5. 类方法静态方法操作类属性 public static void showSchool() { System.out.println(当前学校 Student.school); } // 6. Getter/Setter public String getName() { return name; } public void setName(String name) { this.name name; } public int getAge() { return age; } public void setAge(int age) { this.age age; } public String getGrade() { return grade; } public void setGrade(String grade) { this.grade grade; } // 测试入口 public static void main(String[] args) { Student stu1 new Student(2026001, 张三, 16); stu1.setGrade(高一1班); stu1.attendClass(数学); // 张三学号2026001正在上数学课 Student stu2 new Student(2026002, 李四, 17); stu2.setGrade(高一2班); stu2.attendClass(英语); // 李四学号2026002正在上英语课 System.out.println(Student.species); // 人类 Student.showSchool(); // 当前学校XX中学 } }2.3 static 与非 static修饰符级别所属访问方式static类级别整个类所有对象共享类名 / 对象名推荐类名无static对象级别每个对象独有必须通过对象访问三、封装3.1 核心定义封装是面向对象三大特性之一核心原则隐藏内部细节暴露安全接口。通过访问控制禁止外部直接操作内部数据仅通过指定方法交互。3.2 实现步骤步骤一私有化成员变量public class Student { private String name; private int age; }步骤二提供公共 getter/setterpublic String getName() { return name; } public void setName(String name) { this.name name; } public int getAge() { return age; } public void setAge(int age) { if (age 0 age 120) { this.age age; } else { throw new IllegalArgumentException(年龄必须在0-120之间); } }步骤三有参构造复用 setterpublic Student(String name, int age) { this.name name; this.setAge(age); // 复用校验逻辑 }3.3 访问权限修饰符修饰符本类同包类子类不同包其他类private可访问不可不可不可默认不写可访问可访问不可不可protected可访问可访问可访问不可public可访问可访问可访问可访问封装中成员变量用privategetter/setter 用public。3.4 注意事项getter/setter 命名规范get 变量名首字母大写布尔类型可用isset 变量名首字母大写。构造方法中调用 setter 以复用数据校验逻辑。不过度封装仅暴露必要的接口不需要每个成员都提供 getter/setter。四、Java 内存分区与对象内存分析4.1 内存分区内存区域存储内容生命周期栈内存局部变量、方法调用栈方法执行完毕出栈释放堆内存new创建的对象含成员变量、JDK 7 字符串常量池GC 自动回收4.2 单个对象调用方法 — 内存流程Person p new Person(); p.name 张三; p.age 20; p.show();main进栈定义p。new Person()堆中开辟空间namenull、age0生成地址如0x123。p栈存储地址0x123指向堆中对象。p.name 张三通过地址修改堆中name同理age 20。p.show()show进栈this指向0x123读取name和age输出。show出栈 →main出栈。4.3 多个对象调用方法Person p1 new Person(); p1.name 王五; Person p2 new Person(); p2.name 赵六; p1.show(); p2.show();p1指向堆空间 10x789p2指向堆空间 20xabc。两次show()调用时this分别指向各自堆对象输出各自数据。4.4 多个引用指向同一对象Person p3 p1; // p3 和 p1 指向堆中同一对象修改p3的成员变量会影响p1因为指向同一堆地址。五、基本数据类型与引用数据类型5.1 基本数据类型8 种类型关键字占用内存取值范围默认值字节型byte1 字节-128 ~ 1270短整型short2 字节-32768 ~ 327670整型int4 字节约 ±21 亿0长整型long8 字节-2^63 ~ 2^63-10L单精度浮点float4 字节约 ±3.4×10^380.0f双精度浮点double8 字节约 ±1.8×10^3080.0d字符型char2 字节\u0000 ~ \uffff\u0000布尔型boolean1 字节true / falsefalse直接存储值存于栈内存局部变量。赋值时为值传递int b a;复制的是值修改b不影响a。5.2 引用数据类型包含类String、自定义类、接口List、数组int[]。变量存储的是堆对象地址。赋值时为引用传递复制的是地址指向同一堆对象。5.3 值传递 vs 引用传递// 基本类型值传递不影响原变量 public static void change(int num) { num 20; } int a 10; change(a); System.out.println(a); // 10 // 引用类型引用传递修改堆对象 public static void change(Person p) { p.name 李四; } Person p1 new Person(); p1.name 张三; change(p1); System.out.println(p1.name); // 李四5.4 String 的特殊性String是引用类型但不可变赋值 / 传参时表现类似值传递public static void change(String str) { str world; } // str 指向新对象 String s hello; change(s); System.out.println(s); // hello原对象未变5.5 总结对比对比项基本数据类型引用数据类型存储内容实际值堆对象地址存储位置栈栈引用 堆对象传递方式值传递副本引用传递地址修改影响不影响原变量影响堆中对象String 除外六、this 关键字6.1 核心作用this代表当前对象的引用堆内存地址由 JVM 自动传入每个非静态方法。作用说明区分成员变量与局部变量this.name name;调用当前对象的成员方法this.show();调用当前类的构造方法this(参数)必须位于构造方法第一行作为方法返回值return this;6.2 内存原理public void setName(String name) { this.name name; // this 指向调用该方法的对象 } Student s1 new Student(); // 假设地址 0x123 s1.setName(张三); // JVM 实际传递setName(s1, 张三)this 0x123方法进栈时 JVM 自动传入调用对象的地址作为this通过this定位堆中对象并操作其成员。6.3 注意事项仅非静态方法中有this静态方法属于类不依赖对象。this不能为null对象创建后地址非null。this(参数)调用构造方法时必须写在构造方法的第一行。七、成员变量与局部变量7.1 定义类型定义位置所属成员变量类中、方法外对象 / 类局部变量方法内、代码块中、方法参数方法 / 代码块7.2 五维度对比对比维度成员变量局部变量定义位置类中、方法外方法内 / 代码块 / 方法参数作用域整个类随修饰符变化所在的方法 / 代码块内部默认值有默认值无默认值须显式赋值后使用存储位置实例堆内存静态方法区栈内存方法栈帧中生命周期实例随对象创建 / 回收静态随类加载 / 卸载随方法 / 代码块执行创建、结束销毁7.3 同名变量优先级方法内默认访问局部变量访问成员变量需使用this实例成员或类名静态成员class Person { String name 成员变量; public void test() { String name 局部变量; System.out.println(name); // 局部变量 System.out.println(this.name); // 成员变量 } }八、总结类是抽象模板对象是具体实例通过new 类名(参数)创建。static区分类级别和对象级别的属性和方法属性私有化 getter/setter 实现封装。对象存堆、引用存栈多引用可指向同一对象。基本类型值传递、引用类型地址传递String 不可变特性例外。this由 JVM 自动传入关联方法与调用对象实现对当前对象成员的操作。成员变量作用域广、有默认值局部变量作用域窄、须显式赋值。