
Java面向对象编程的本质是用类建模事物、对象承载状态、包装、继承和多态组织逻辑类是抽象模板对象是具体的例子包装注重可控访问继承表达“一”组合表达“一”界面定义能力合同抽象类提供共同骨架。在Java中面向对象编程OOP思想的本质是**用“类”建模现实事物用“对象”承载具体状态然后通过包装、继承和多态三个支柱组织代码逻辑**。它不是语法糖而是提前在结构层面回答“谁在做什么怎么做的细节藏在哪里以及未来是否应该更改新型号的老代码”这些工程问题。 什么是类别和对象模板和产品之间的区别必须明确类是抽象模板不占用内存对象是在堆上分配空间的具体例子。很多人写完了class Person急着调整方法却忘了没有new Person()没有真正可操作的个体。类中定义的字段(如String name只是“每个对象都应该有这个名字”实际值只存在于每个对象自己的内存块中类中的方法(如void speak()代码只存储一份(方法区)但每次调用时this指的是当前的具体对象错误示范Person.name 张三——name是实例变量不能直接用类名访问编译错误报告non-static variable name cannot be referenced from a static context不加封装 private 完成:重点是“可控访问路径”封装的核心不是防人而是防错——让字段只能通过你设计的方式读写校验、日志、触发更新等逻辑可以插入中间。private String id;这是起点但真正起作用的是你写的public void setId(String id)方法体中是否有非空判断格式验证不要为了“包装”而包装如果一个字段总是只在这个类别中使用而且没有业务规则约束则强制塞 getter/setter 相反增加冗余常见坑在setter里直接赋值this.id id;忘记深拷贝可变对象(例如(例如)private List tags;外部引用后会改变污染的内部状态只有继承和多态合作才能释放力量:引用父类 子类对象是关键组合单写class Dog extends Animal没用真正体现出来 OOP 价值是在运行过程中动态决定行为——即使用Animal a new Dog(); a.makeSound();这种写法。必须重写Override父类方法否则调用父类默认实现子类构造器的第一行默认情况是super()如果父类没有参构造器子类必须显式调用super(...)否则编译失败不要滥用继承例如Car和Engine这是一种“有”关系应该使用组合private Engine engine;而不是继承——继承表达“是一个”Dog is an Animal选择抽象类和接口看你是想约束“是什么”还是“能做什么”abstract class常见的骨架适合描述一种东西(例如它们都有name、都必须实现move()还可提供默认实现interface专注于定义能力合同(例如(例如)Flyable、Serializable支持类实现多个接口。JDK 8 接口可以有default方法但不能有结构器或实例字段——它始终是行为准则而不是实体模板抽象类可以有结构器、成员变量、静态方法和具体方法接口不好。因此当您需要共享状态或初始逻辑时抽象类更合适容易忽略的点接口中的字段自动public static final即使不写也不要在界面中定义可变常量(比如int COUNT 0;这是反模式真正困难的从来不是写符合语法的 OOP 代码但判断一个功能应该分为几类哪些应该继承哪些应该组合哪些行为应该抽象成界面——这些决定没有标准答案只取决于你是否清楚地理解业务边界。