之前把 Java 基础语法过完了if、for、数组、方法写起来还算顺手可一碰到面向对象直接卡壳。很长一段时间我都觉得不就是写个 class 然后 new 对象吗好像看懂了但一写代码就乱分不清什么时候用继承、什么时候封装多态更是越看越懵。后来慢慢敲 demo、踩坑才发现面向对象不是一堆语法是一种思考方式。Java 本身就是面向对象语言后面学集合、框架全是这套东西。如果这里糊里糊涂后面基本寸步难行。这篇就按我自己理解的思路整理没有生硬的课本定义。先搞懂最根本的类和对象一句话类是模板对象是模板造出来的实例。 举个最简单的例子。我们说 “学生”这是一个类别是抽象的里面有学号、姓名、年龄这些属性还有上课、写作业这些行为这就是类。 而你、我、班里其他同学一个个具体的人就是对象。写代码里就是属性 → 成员变量行为 → 成员方法class Student { String name; int age; void study() { System.out.println(name 在学习); } }new 就是根据这个模板造一个实实在在的对象Student s1 new Student(); s1.name 小张; s1.study();刚学的时候很容易犯一个错把类当成对象。记住类只是图纸图纸不能直接用new 出来的才是能操作的东西。封装把东西藏起来可控地访问封装是三大特性第一个也是我们最先要养成的习惯。最开始写代码成员变量直接写 public外面随便改public int age;这样很省事但问题很大。别人写代码的时候可以直接给 age 赋值 - 20逻辑直接坏掉类里面的数据不受控制。封装思路很简单成员变量用private藏起来外面不能直接访问提供 get、set 方法想要读或者修改只能走这两个方法在 set 里面加判断过滤非法数据private int age; public void setAge(int age) { if (age 0 age 120) { this.age age; } else { System.out.println(年龄不合法); } } public int getAge() { return age; }这里顺带说this。this代表当前这个对象。方法里局部变量和成员变量重名的时候靠 this 区分。很多人觉得封装就是写 get/set很麻烦。我之前也这么想。后来写稍微复杂一点的代码才明白封装的本质是保护内部数据把细节隐藏只暴露安全的入口。构造方法new 对象的时候自动调用构造方法属于类里很特殊的方法。 特点名字和类名一模一样没有返回值连 void 都不能写。 作用创建对象的时候给成员变量初始化。如果我们自己不写构造方法编译器偷偷给我们加一个无参构造。一旦你手写了有参构造默认的无参构造就消失了想用就得自己补上这个坑我踩过无数次。public Student(String name, int age) { this.name name; this.age age; }以后 new 的时候就可以直接传值Student s new Student(小李, 20);继承减少重复代码但别乱用继承就是子类去拿父类的东西关键字extends。 比如父类 Person有 name、age、吃饭的方法Student 属于 Person就可以继承它不用再重复写一遍 name、age。class Student extends Person { }Java 继承有一个硬性规则只支持单继承一个子类只能直接继承一个父类不能像别的语言一样同时继承好几个。两个关键字super代表父类对象。子类想调用父类的构造方法、成员方法、成员变量就用 super。而且 super () 放在构造方法第一行。方法重写Override子类写一个和父类方法名、参数、返回值完全一样的方法就把父类的逻辑覆盖掉。重写不是随便写权限不能比父类更严格。这里有一个很重要的提醒继承是is-a的关系。 学生是一个人 → 可以继承 Person。 笔记本是一个学生这就不对不能乱继承。不要为了少写两行代码就强行继承后面代码会很难维护。多态面向对象里最难理解的一块多态一句话总结同一个行为不同对象有不同实现。 写法就是父类引用指向子类对象Person p new Student();记住这句口诀编译看左边运行看右边。 编译的时候编译器拿左边父类的规则检查程序跑起来执行的是子类重写后的方法。但是它有局限父类引用不能直接调用子类独有的方法。如果非要调用得强制类型转换转错了会抛异常 ClassCastException。很多人疑惑多态到底有啥用 我之前也觉得写着费劲直到后面写统一的方法接收父类类型传进去任何子类对象都能跑。代码扩展性会好很多新增子类的时候不用大面积改动旧代码。举个通俗例子父类是动物有 shout 方法子类猫、狗分别重写 shout。写一个让动物叫的方法接收 Animal不管传猫还是狗都会发出自己对应的叫声这就是多态带来的便利。权限修饰符简单捋清楚表格修饰符本类同包子类其他包private✅❌❌❌默认不写✅✅❌❌protected✅✅✅❌public✅✅✅✅不用死背写多了自然熟。开发里最常用成员变量 private方法一般 public。static 和 final容易和面向对象混在一起static属于类不属于某个对象。静态成员直接用类名调用不用 new。静态方法里面不能直接访问非静态成员因为静态加载更早。final修饰变量就是常量修饰方法不能被重写修饰类不能被继承。最后聊聊我学这块的真实感受刚接触面向对象的时候总忍不住用之前写 C 语言那种 “面向过程” 的思路先干什么再干什么一步步往下写。 面向对象是反过来的先思考这里有哪些事物事物有什么属性、行为事物之间是什么关系再去写代码。这个思维转换比记语法难很多。不用逼自己一次性吃透。看不懂多态就写几个小 demo父类子类来回试打印日志看调用的是谁的方法分不清继承什么时候用就停下来想一想是不是 is-a 关系。还有一个忠告别上来就写很复杂的类也别一口气把封装继承多态堆在同一个项目里。先写简单的学生、动物 demo把每一个特性单独跑通再组合起来。面向对象是 Java 的灵魂后面学集合、接口、抽象类、框架全都是在这个基础上延伸。这里慢一点没关系理解透了后面的学习会顺畅不少。