前言作为新手小白刚接触Java时“面向对象”可能是第一个让你感到抽象的概念。别怕这篇文章会从最基础的思想讲起一步步带你理解什么是对象、类以及面向对象的三大特性封装、继承、多态。第一部分面向对象基础1. 面向过程 vs 面向对象· 面向过程把问题拆解成一步步的步骤按顺序执行像做菜教程。· 面向对象先找出程序里有哪些“对象”然后让这些对象互相配合来解决问题像导演安排演员。Java是面向对象的语言所以我们要用“对象”的思维来写程序。2. 对象是什么· 对象 客观世界里的任何事物在Java中的表现。· 对象由两部分组成· 属性静态特征比如人的姓名、年龄。· 方法动态行为比如人吃饭、走路。3. 类和对象的关系· 类 对象的模板蓝图。· 对象 根据类创建出来的具体实例。比如Student 是一个类而 new Student() 创建的就是一个具体的学生对象。4. 类的组成重点一个标准的类包含三样东西属性、方法、构造方法。① 属性成员变量· 定义在类里面、方法外面。· 有默认值int→0double→0.0boolean→false引用→null。· 可以和局部变量重名重名时在方法内优先使用局部变量如果想用成员变量用 this 区分。javapublic class Student {String name; // 成员变量int age;}② 方法成员方法· 描述对象能做什么。· 定义格式public 返回值类型 方法名(参数列表) { 方法体 }· 方法重载Overload同一个类中方法名相同但参数列表不同个数、类型、顺序。好处让方法更灵活比如 System.out.println() 可以打印各种类型。javapublic class Calculator {public int add(int a, int b) { return a b; }public double add(double a, double b) { return a b; } // 重载}③ 构造方法构造器· 方法名和类名完全相同没有返回值连void都不写。· 作用给属性赋初始值对象创建时自动调用。· 如果没写任何构造方法系统会默认给一个无参构造。但如果写了有参构造系统就不再提供默认无参构造建议手动写上无参构造。javapublic class Student {String name;int age;// 无参构造public Student() {}// 有参构造public Student(String name, int age) {this.name name;this.age age;}}5. 对象的创建和使用javaStudent s new Student(小明, 18);System.out.println(s.name); // 访问属性s.age 19; // 修改属性s.study(); // 调用方法6. this 关键字重要· this. 代表当前对象用来区分成员变量和局部变量。· this() 调用本类的其他构造方法必须写在构造方法的第一行。javapublic Student() {this(默认名字, 0); // 调用有参构造}7. 引用与内存理解· 引用 对象类型的变量存储的是对象在堆内存中的地址。· 引用赋值为 null 时调用方法会报 NullPointerException空指针异常。· 引用之间赋值传递的是地址基本类型赋值传递的是数值。第二部分面向对象的三大特性一、封装Encapsulation封装就是把对象的属性和实现细节隐藏起来只对外暴露必要的接口方法。1. 访问修饰符Java有四种访问修饰符它们的可见范围从小到大依次是· private仅在本类内部可见对外完全隐藏。· default不写在本类和同一个包内的其他类可见包括同包子类。· protected在本类、同包类以及不同包的子类中可见。· public在任何位置都可见完全没有限制。理解这个顺序后我们就能根据需求控制属性和方法的暴露程度。2. 封装的具体做法· 属性私有化用 private 修饰属性。· 提供公开的 get/set 方法让外界通过方法来访问和修改属性。javapublic class Person {private String name;private int age;public 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) { // 可以在set里加逻辑控制this.age age;}}}封装的好处保护数据安全提高代码的可维护性。二、继承Inheritance继承表示类与类之间的 is-a 关系子类是一种父类。例如Dog 是一种 Animal所以 Dog extends Animal。1. 语法javaclass 子类 extends 父类 {// 子类特有内容}2. 继承的好处· 提高代码复用性子类可以直接使用父类的属性和方法。· 提高代码可扩展性。3. 方法重写Override【重点】子类可以重新定义父类中已有的方法方法名、参数列表、返回值类型完全相同。· 访问修饰符不能比父类更严格比如父类是 public子类不能是 protected。· 重写后子类对象调用该方法会优先使用子类的版本。javaclass Animal {public void shout() {System.out.println(动物叫);}}class Dog extends Animal {Overridepublic void shout() {System.out.println(汪汪汪);}}重载 vs 重写· 重载Overload同一个类方法名相同参数不同。· 重写Override子父类之间方法签名完全一样。4. 子类能继承父类的哪些内容· 构造方法不能继承因为构造方法名必须和类名一致。· 属性和方法能否继承取决于访问修饰符· private 修饰的完全不能继承。· default 修饰的只有同包子类可以继承。· protected 和 public 修饰的都可以被子类继承protected 允许不同包的子类继承。5. super 关键字· super() 或 super(参数)在子类构造方法中调用父类的构造方法必须写在第一行。· super.属性 / super.方法()在子类中调用父类的属性或方法当子类覆盖了父类方法时可以用 super 调用父类版本。javaclass Dog extends Animal {public Dog(String name) {super(name); // 调用父类有参构造}public void printShout() {super.shout(); // 调用父类的shout方法}}6. Java继承特点· 单继承一个类只能有一个直接父类但可以多级继承A→B→C。· 创建子类对象时会先创建父类对象递归所以构造方法调用顺序是父类构造 → 子类构造。三、多态Polymorphism多态 同一个行为不同对象表现出不同的形态。比如Animal 类型的引用指向 Dog 对象调用 shout() 时实际执行的是 Dog 的 shout()。1. 多态的前提· 有继承关系。· 有方法重写。· 父类引用指向子类对象向上转型。javaAnimal a new Dog(); // 父类引用指向子类对象a.shout(); // 输出 汪汪汪多态2. 类型转换· 向上转型自动Animal a new Dog();· 向下转型强制Dog d (Dog) a;需要先用 instanceof 检查避免 ClassCastExceptionjavaif (a instanceof Dog) {Dog d (Dog) a;d.eat(); // 调用Dog特有的方法}3. 多态的实际应用开发中很常用· 多态数组数组类型是父类可以存储任何子类对象。· 多态参数方法参数写成父类可以传入任意子类对象。· 多态返回值方法返回父类类型可以返回任意子类对象。java// 多态参数示例public void feed(Animal a) {a.shout();}// 调用时可以传 Dog、Cat 等feed(new Dog());feed(new Cat());4. 多态的好处· 屏蔽不同子类的差异统一处理。· 让程序更加灵活、可扩展新增子类不影响已有代码。总结现在我们把三大特性串起来回顾一下· 封装用 private 隐藏属性通过 get/set 控制访问保护数据安全降低耦合。· 继承用 extends 建立父子关系子类复用父类代码通过方法重写实现个性记得构造方法和 super 的规则。· 多态用父类引用指向子类对象配合重写让同一个方法调用表现出不同行为同时利用 instanceof 安全转型让程序更灵活通用。学习面向对象最重要的是理解概念然后动手敲代码。建议自己写几个小类比如 Person、Student、Teacher把封装、继承、多态都用上感受它们是如何协作的。如果这篇文章对你有帮助欢迎点赞收藏 有问题也可以在评论区交流