news 2026/6/15 2:03:21

Java——面向对象三大特性,封装、继承、多态

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java——面向对象三大特性,封装、继承、多态

今天Java的学习内容是面向对象的三大特性:封装、继承、多态。这是Java中非常核心的内容,面试也经常考。

说实话今天内容有点多,脑子有点晕,但整理完笔记后清晰多了。下面是我今天的学习总结。


一、封装

1. 修饰符

  • private:私有的,只能在本类中使用

  • public:公开的,任何地方都能用

2. 封装的要求(标准写法)

public class Student { // 1. 属性私有化 private String name; private int age; // 2. 提供公开的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; } }

3. 使用方式

Student stu = new Student(); stu.setName("张三"); stu.setAge(18); System.out.println(stu.getName() + "," + stu.getAge());

封装的好处:保护数据安全,控制访问权限,可以在set方法中添加逻辑校验。


二、继承

1. 概念

继承体现的是"is-a"关系:

  • 铅笔是一种

  • 是一种动物

语法

class 子类 extends 父类 { }

示例

// 父类 class Animal { String name; public void eat() { System.out.println("吃东西"); } } // 子类 class Dog extends Animal { public void bark() { System.out.println("汪汪叫"); } }

2. 继承的好处

  • 提高代码复用性:子类可以直接使用父类的属性和方法

  • 提高代码可扩展性:可以在子类中添加新功能

3. 方法覆盖(Override/重写)【面试重点】

概念:子类中定义和父类同名、同参、同返回值的方法。

要求

  • 方法名、参数列表、返回值类型都要相同

  • 访问修饰符相同或更宽(privatedefaultprotectedpublic

示例

class Animal { public void sound() { System.out.println("动物叫"); } } class Dog extends Animal { @Override // 注解,表示这是重写,推荐加上 public void sound() { System.out.println("汪汪汪"); } }

使用:子类对象调用时,优先使用子类重写后的方法。

面试题:Override 和 Overload 的区别

对比项Override(重写)Overload(重载)
关系父子类之间同一个类中
方法名相同相同
参数列表必须相同必须不同
返回值相同无要求
修饰符相同或更宽无要求

4. Java继承的特点

  • 单继承:一个类只能有一个直接父类

  • 但可以有多个间接父类(多级继承)

class A {} class B extends A {} // B的直接父类是A class C extends B {} // C的直接父类是B,间接父类是A

5. 子类能继承父类的哪些内容?

构造方法:不能被继承(因为构造方法名必须和类名一致)

属性和方法:取决于访问修饰符

修饰符能否被继承
private❌ 不能
default✅ 同包子类可以
protected✅ 可以
public✅ 可以

6. 创建对象的过程(继承情况下)

Dog d = new Dog();

执行顺序:

  1. 分配空间(子类 + 所有父类的空间)

  2. 递归创建父类对象(初始化父类属性 → 执行父类构造方法)

  3. 完成子类对象创建(初始化子类属性 → 执行子类构造方法)

7. super关键字【面试重点】

第一种用法:super()/super(实参)

在子类构造方法中,指示调用父类的哪个构造方法。

class Animal { public Animal() { System.out.println("父类无参构造"); } public Animal(String name) { System.out.println("父类有参构造:" + name); } } class Dog extends Animal { public Dog() { super(); // 调用父类无参构造,可以省略,JVM默认添加 System.out.println("子类无参构造"); } public Dog(String name) { super(name); // 调用父类有参构造 System.out.println("子类有参构造:" + name); } }

规则

  • super()必须写在构造方法第一行

  • 子类构造方法第一行如果没有super()/this(),JVM会默认添加super()

  • this()super()不能同时出现在同一个构造方法中

第二种用法:super.

用于调用父类的属性或方法。

class Animal { String name = "动物"; } class Dog extends Animal { String name = "狗"; public void show() { System.out.println(name); // 狗 System.out.println(super.name); // 动物 } }

三、多态

1. 多态的前提

  1. 必须有继承关系

  2. 必须有方法重写

  3. 父类引用指向子类对象

2. 多态的语法

父类类型 引用名 = new 子类类型();

示例

Animal a = new Dog(); // 父类引用指向子类对象 a.eat(); // 调用的是子类重写后的方法

3. 多态的特点

  • 编译看左边,运行看右边

    • 编译时:检查父类中有没有这个方法

    • 运行时:执行子类重写后的方法

Animal a = new Dog(); a.eat(); // ✅ 父类有eat(),运行执行Dog的eat() a.bark(); // ❌ 编译报错,父类中没有bark()方法

4. 引用类型转换

向上转型(自动)
Dog d = new Dog(); Animal a = d; // 自动转换,安全
向下转型(强制)
Animal a = new Dog(); Dog d = (Dog) a; // 强制转换,需要保证实际类型是Dog

注意:如果实际类型不匹配,会报ClassCastException

Animal a = new Dog(); Cat c = (Cat) a; // 运行报错:ClassCastException

5. instanceof 关键字

用于判断引用的实际对象类型是否兼容某个类。

Animal a = new Dog(); if (a instanceof Dog) { Dog d = (Dog) a; System.out.println("转换成功"); } if (a instanceof Cat) { Cat c = (Cat) a; // 不会执行,因为a实际上是Dog }

在向下转型前,建议先用instanceof判断,避免类型转换异常。

6. 多态的实际应用(开发重点)

用在数组上
Animal[] arr = new Animal[3]; arr[0] = new Dog(); arr[1] = new Cat(); arr[2] = new Bird();
用在方法参数上
public void feed(Animal a) { a.eat(); // 不管传什么动物,都能调用eat() } // 调用 feed(new Dog()); feed(new Cat());
用在返回值上
public Animal getAnimal(int type) { if (type == 1) { return new Dog(); } else { return new Cat(); } }

7. 多态的好处

  • 屏蔽不同子类之间的差异性,统一管理

  • 让程序更灵活、更通用


四、我踩过的坑

坑1:封装时忘记提供getter/setter

private int age; // 忘了写getAge()和setAge(),外部无法访问

解决:属性私有化后,必须提供公开的访问方法。

坑2:继承时子类构造方法没有调用父类构造方法

class Parent { public Parent(String name) { // 有参构造 } } class Child extends Parent { public Child() { // 编译报错:父类没有无参构造 } }

解决:子类构造方法中显式调用父类的有参构造super(name)

坑3:方法重写时写错参数

// 父类 public void eat() { } // 子类想重写,但写成了重载 public void eat(String food) { } // 这是重载,不是重写

解决:重写时参数列表必须完全相同,建议加上@Override注解检查。

坑4:向下转型时没做instanceof判断

Animal a = new Dog(); Cat c = (Cat) a; // 运行报错

解决:转型前用instanceof判断。


总结

今天学的三大特性是面向对象的核心:

特性关键词核心要点
封装private+get/set隐藏实现细节,保护数据安全
继承extends代码复用,is-a关系,单继承
多态父类引用指向子类对象编译看左,运行看右,灵活通用

面试高频题

  • Override和Overload的区别

  • 访问修饰符的继承性

  • superthis的区别

  • 多态的前提和特点

  • instanceof的作用

我接下来的任务:把课堂上的案例都敲一遍(比如动物继承体系、图形面积计算等),加上注释,再做一些练习题巩固。

如果你也在学Java,欢迎一起交流,我们明天继续!


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 1:55:51

别再只写‘熟练使用’了!技术简历‘个人业绩’模块的5个高阶写法(以Golang微服务为例)

技术简历中的个人业绩:用Golang微服务项目打动面试官的5个策略在技术招聘中,简历上的"个人业绩"部分往往是决定你能否进入面试环节的关键。许多开发者习惯性地罗列技术栈和项目职责,却忽略了量化成果和展示技术影响力的重要性。本文…

作者头像 李华
网站建设 2026/6/15 1:49:02

从调和级数到算法复杂度:那些藏在程序员面试里的级数敛散性考点

从调和级数到算法复杂度:程序员必须掌握的级数敛散性实战当面试官在白板上写下那段看似简单的循环代码时,大多数候选人的第一反应是分析它的时间复杂度——但真正的高手会立刻意识到,这段代码背后隐藏着一个古老的数学幽灵:调和级…

作者头像 李华
网站建设 2026/6/15 1:49:01

除了LeetCode,这些能写进简历的官方编程竞赛你知道几个?手把手教你从CCF-CSP认证到ICPC区域赛

技术竞赛进阶指南:从认证到国际舞台的简历镀金之路 当HR在数百份简历中快速筛选时,"熟练掌握数据结构与算法"这样的描述早已失去辨识度。真正能让技术简历脱颖而出的,是那些经过权威第三方验证的能力证明——这就是专业编程竞赛和认…

作者头像 李华
网站建设 2026/6/15 1:44:03

第3次作业

1.遍历文件2.用户登录系统

作者头像 李华