Java OOP 核心:从类与对象到执行机制全解析(含代码实战)
一、编程思想对比面向过程 vs 面向对象更具象的对比表格维度面向过程C 语言面向对象Java核心单位函数 / 过程如void sort(int[] arr)类与对象如ArrayList类、new ArrayList()对象组织方式按 “步骤” 拆分功能数据与方法分离按 “对象” 封装数据和方法通过对象交互实现功能代码复用函数复用复制粘贴、函数调用继承、接口、多态实现复用扩展性修改一处需改所有关联步骤扩展性差新增对象 / 子类即可扩展符合开闭原则适用场景简单程序如计算器、单功能脚本复杂程序如电商系统、框架开发实战示例实现 “猫叫” 功能面向过程c运行// C语言面向过程 #include stdio.h // 数据 char* catColor black; // 方法 void catMeow() { printf(一只%s的猫在叫\n, catColor); } int main() { catMeow(); // 调用过程 return 0; }面向对象java运行// Java面向对象 class Cat { // 封装数据 private String color; // 封装方法 public Cat(String color) { this.color color; } public void meow() { System.out.println(一只 color 的猫在叫); } } public class Test { public static void main(String[] args) { // 创建对象数据和方法绑定 Cat cat new Cat(black); cat.meow(); // 对象交互 } }二、类与对象模板与实例补充核心细节1. 类的组成完整结构一个标准的 Java 类包含成员变量属性对象的状态如name、age成员方法对象的行为如eat()、sleep()构造方法创建对象时初始化属性与类名同名无返回值代码块静态代码块、实例代码块下文详解内部类进阶如成员内部类、静态内部类。2. 对象的创建与内存布局java运行// 类模板 class Person { String name; int age; public Person(String name, int age) { this.name name; this.age age; } } // 创建对象实例 Person p1 new Person(张三, 20); Person p2 new Person(李四, 22);内存层面类的模板信息属性定义、方法字节码存在JVM 方法区p1、p2是引用变量存在虚拟机栈实际对象new Person(...)存在堆内存每个对象有独立的属性值方法共享类的模板。3. 易错点引用类型 vs 基本类型赋值java运行// 1. 基本类型赋值是“值拷贝”互不影响 int a 10; int b a; b 20; System.out.println(a); // 输出 10a 不变 // 2. 引用类型赋值是“地址拷贝”指向同一对象 Person p1 new Person(张三, 20); Person p2 p1; p2.age 25; System.out.println(p1.age); // 输出 25p1 被修改 // 3. 浮点转整型的坑原文补充 float f 10.11f; int num1 (int) f; // 强制转换丢失精度num110 // int num2 f; // 编译报错必须显式强制转换三、访问修饰符权限控制的核心补充使用规范原文的访问范围表格已清晰这里补充实战使用规范阿里开发手册推荐表格修饰符使用场景禁忌public对外提供的接口、工具类、主类不用于私有属性 / 方法protected父类中需要被子类继承的成员不用于非继承场景的成员默认同包内的工具类、辅助类跨包调用时避免使用private类内部的属性、工具方法如校验绝不要用于需要对外暴露的成员实战示例封装的正确写法java运行class User { // 私有属性禁止外部直接访问 private String username; private int age; // 公共getter/setter控制访问逻辑 public String getUsername() { return username; } public void setUsername(String username) { // 校验逻辑用户名不能为空 if (username null || username.isEmpty()) { throw new IllegalArgumentException(用户名不能为空); } this.username username; } public int getAge() { return age; } public void setAge(int age) { // 校验逻辑年龄合法范围 if (age 0 || age 150) { throw new IllegalArgumentException(年龄不合法); } this.age age; } }四、OOP 三大特性封装、继承、多态补充深度解析1. 封装数据安全的核心核心目标隐藏内部实现只暴露可控接口优势数据安全通过 setter 校验属性值如年龄不能为负易维护修改内部逻辑如校验规则不影响外部调用降低耦合外部只依赖接口不依赖内部实现。2. 继承代码复用的核心关键规则Java 单继承一个子类只能继承一个父类避免多继承的菱形问题子类构造方法默认调用父类无参构造super()若父类无无参构造子类必须显式调用父类有参构造super关键字指代父类对象用于访问父类的属性 / 方法 / 构造方法。实战示例继承的正确写法java运行// 父类抽象公共属性和方法 class Animal { protected String name; public Animal(String name) { this.name name; } public void eat() { System.out.println(name 在吃东西); } } // 子类继承并扩展 class Dog extends Animal { // 子类构造必须显式调用父类构造 public Dog(String name) { super(name); // 调用父类有参构造 } // 扩展父类功能 public void bark() { System.out.println(name 在叫); } // 重写父类方法 Override public void eat() { System.out.println(name 在吃骨头); } }3. 多态灵活扩展的核心实现条件继承 方法重写 父类引用指向子类对象核心优势代码可扩展新增子类无需修改原有逻辑开闭原则常见形式父类引用指向子类对象接口引用指向实现类对象最常用。实战示例多态的实际应用java运行// 接口规范 interface Shape { double getArea(); // 计算面积 } // 实现类1圆形 class Circle implements Shape { private double radius; public Circle(double radius) { this.radius radius; } Override public double getArea() { return Math.PI * radius * radius; } } // 实现类2矩形 class Rectangle implements Shape { private double width; private double height; public Rectangle(double width, double height) { this.width width; this.height height; } Override public double getArea() { return width * height; } } // 多态调用新增子类无需修改此方法 public class Test { public static void printArea(Shape shape) { System.out.println(面积 shape.getArea()); } public static void main(String[] args) { Shape circle new Circle(2); Shape rectangle new Rectangle(3, 4); printArea(circle); // 输出 12.566... printArea(rectangle); // 输出 12.0 // 新增三角形子类只需实现Shape接口printArea方法无需修改 } }4. 关键关键字补充final/this/super表格关键字修饰目标核心作用final类不可被继承如String类方法不可被重写如父类的核心方法变量常量赋值后不可修改如final int MAX_AGE 150this-指代当前对象区分成员变量和局部变量调用当前类构造方法this(...)super-指代父类对象访问父类属性 / 方法调用父类构造方法super(...)五、代码执行顺序静态代码块 构造方法补充完整规则原文的执行顺序示例是核心考点这里补充完整的执行优先级从高到低父类的静态变量 / 静态代码块按声明顺序执行子类的静态变量 / 静态代码块按声明顺序执行父类的实例变量 / 实例代码块按声明顺序执行父类的构造方法子类的实例变量 / 实例代码块按声明顺序执行子类的构造方法。1. 扩展示例含父类 子类java运行class Parent { // 父类静态变量 public static int parentStaticVar 10; // 父类静态代码块 static { System.out.println(父类静态代码块1 parentStaticVar); } // 父类实例变量 public int parentInstanceVar 20; // 父类实例代码块 { System.out.println(父类实例代码块 parentInstanceVar); } // 父类构造方法 public Parent() { System.out.println(父类构造方法); } // 父类静态代码块2 static { System.out.println(父类静态代码块2); } } class Child extends Parent { // 子类静态变量 public static int childStaticVar 30; // 子类静态代码块 static { System.out.println(子类静态代码块1 childStaticVar); } // 子类实例变量 public int childInstanceVar 40; // 子类实例代码块 { System.out.println(子类实例代码块 childInstanceVar); } // 子类构造方法 public Child() { System.out.println(子类构造方法); } // 子类静态代码块2 static { System.out.println(子类静态代码块2); } } public class Test { public static void main(String[] args) { System.out.println(第一次创建Child对象); Child c1 new Child(); System.out.println(-------------------); System.out.println(第二次创建Child对象); Child c2 new Child(); } }2. 输出结果 解析plaintext第一次创建Child对象 父类静态代码块110 父类静态代码块2 子类静态代码块130 子类静态代码块2 父类实例代码块20 父类构造方法 子类实例代码块40 子类构造方法 ------------------- 第二次创建Child对象 父类实例代码块20 父类构造方法 子类实例代码块40 子类构造方法关键结论静态内容变量 / 代码块仅在类加载时执行一次后续创建对象不再执行实例内容变量 / 代码块 / 构造方法每次创建对象都执行子类初始化时必先完成父类的初始化静态→实例→构造。六、OOP 进阶方向补充学习路径原文列出了进阶方向这里补充学习优先级和核心应用场景表格进阶知识点学习优先级核心应用场景接口最高定义规范、实现多态、解耦注解高框架配置Spring、代码校验反射中框架开发MyBatis、动态代理代理中AOP 编程Spring、功能增强Socket低网络通信、分布式系统总结类与对象类是模板对象是实例引用类型赋值是 “地址拷贝”基本类型是 “值拷贝”访问修饰符private 封装内部细节public 暴露接口protected 用于继承默认用于同包交互OOP 三大特性封装保证数据安全继承实现代码复用多态实现灵活扩展执行顺序静态内容类加载时执行一次→ 父类实例内容 → 父类构造 → 子类实例内容 → 子类构造。