当前位置: 首页 > news >正文

JavaSE核心知识点02面向对象编程02-02(封装、继承、多态)

🤟致敬读者

  • 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉

📘博主相关

  • 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息

文章目录

    • JavaSE核心知识点02面向对象编程02-02(封装、继承、多态)
    • **一、封装(Encapsulation)**
      • **1. 什么是封装?**
      • **2. 如何实现封装?**
      • **3. 代码示例**
      • **4. 封装的好处**
    • **二、继承(Inheritance)**
      • **1. 什么是继承?**
      • **2. 代码示例**
      • **3. 继承的注意事项**
    • **三、多态(Polymorphism)**
      • **1. 什么是多态?**
      • **2. 方法重写(Override)**
      • **3. 向上转型(Upcasting)**
      • **4. 多态的优势**
    • **四、总结与对比**
    • **五、常见问题**
      • **1. 方法重载(Overload) vs 方法重写(Override)**
      • **2. 什么时候用继承?**


📃文章前言

  • 🔷文章均为学习工作中整理的笔记。
  • 🔶如有错误请指正,共同学习进步。

JavaSE核心知识点02面向对象编程02-02(封装、继承、多态)

好的!封装、继承和多态是面向对象编程(OOP)的三大核心特性,理解它们对掌握Java至关重要。我会用通俗易懂的方式为你讲解,并结合代码示例帮助你理解。


一、封装(Encapsulation)

1. 什么是封装?

  • 定义:将数据(属性)和操作数据的方法(行为)捆绑在一个类中,并对外隐藏内部实现细节。
  • 核心思想:隐藏对象的属性和实现细节,仅对外公开接口(方法)进行交互。
  • 目的:提高安全性、可维护性、灵活性(例如:避免属性被随意修改)。

2. 如何实现封装?

  • 使用访问修饰符控制属性的可见性:
    • private:属性只能在当前类内访问。
    • public:属性或方法可以被任何类访问。
    • protected:允许子类和同包类访问。
  • 提供公共的getter和setter方法操作属性。

3. 代码示例

public class Student {// 私有属性,外部无法直接访问private String name;private int age;// 公共的getter方法,允许外部获取属性值public String getName() {return name;}// 公共的setter方法,允许外部设置属性值(可添加校验逻辑)public void setName(String name) {if (name != null && !name.isEmpty()) {this.name = name;}}public int getAge() {return age;}public void setAge(int age) {if (age >= 0 && age <= 120) {  // 校验年龄合法性this.age = age;}}
}// 使用示例
public class Main {public static void main(String[] args) {Student stu = new Student();stu.setName("Alice");stu.setAge(20);System.out.println(stu.getName() + ": " + stu.getAge());}
}

4. 封装的好处

  • 安全性:防止属性被非法修改(如年龄为负数)。
  • 灵活性:可以在setter方法中添加校验逻辑,而外部调用者无需关心。
  • 代码维护:修改类的内部实现时,不影响外部代码。

二、继承(Inheritance)

1. 什么是继承?

  • 定义:子类(派生类)继承父类(基类)的属性和方法,并可以扩展自己的功能。
  • 核心思想:代码复用 + 扩展功能。
  • 语法:使用 extends 关键字。

2. 代码示例

// 父类:Animal
class Animal {private String name;public void eat() {System.out.println(name + " is eating.");}public void setName(String name) {this.name = name;}
}// 子类:Dog(继承Animal)
class Dog extends Animal {// 扩展自己的方法public void bark() {System.out.println("Woof! Woof!");}
}// 使用示例
public class Main {public static void main(String[] args) {Dog dog = new Dog();dog.setName("Buddy");dog.eat();   // 调用父类方法dog.bark();  // 调用子类方法}
}

3. 继承的注意事项

  • 单继承:Java中一个类只能直接继承一个父类(不支持多继承)。
  • 构造方法:子类构造方法默认会调用父类的无参构造方法(可通过 super() 显式调用父类构造方法)。
  • 方法重写(Override):子类可以重写父类的方法(后面多态中详细讲解)。

三、多态(Polymorphism)

1. 什么是多态?

  • 定义:同一操作作用于不同对象,可以有不同的行为(例如:同一方法在不同子类中有不同实现)。
  • 两种形式
    1. 编译时多态(静态多态):方法重载(Overload)。
    2. 运行时多态(动态多态):方法重写(Override) + 向上转型(Upcasting)。

2. 方法重写(Override)

  • 子类重新定义父类中已有的方法。
  • 规则
    • 方法名、参数列表必须与父类方法相同。
    • 返回类型可以是父类方法返回类型的子类。
    • 访问权限不能比父类方法更严格。
class Animal {public void makeSound() {System.out.println("Animal makes a sound");}
}class Dog extends Animal {@Override  // 注解:表示重写父类方法public void makeSound() {System.out.println("Dog barks: Woof!");}
}class Cat extends Animal {@Overridepublic void makeSound() {System.out.println("Cat meows: Meow~");}
}

3. 向上转型(Upcasting)

  • 将子类对象赋值给父类引用变量。
  • 目的:通过父类引用调用子类重写的方法,实现多态。
public class Main {public static void main(String[] args) {Animal animal1 = new Dog();  // 向上转型Animal animal2 = new Cat();animal1.makeSound();  // 输出 Dog barks: Woof!animal2.makeSound();  // 输出 Cat meows: Meow~}
}

4. 多态的优势

  • 代码扩展性:新增子类时无需修改原有代码。
  • 统一接口:用父类引用处理不同子类对象。

四、总结与对比

特性核心思想关键实现方式
封装隐藏细节,暴露接口private属性 + getter/setter
继承代码复用,扩展功能extends关键字 + 方法重写
多态同一方法不同表现方法重写 + 向上转型

五、常见问题

1. 方法重载(Overload) vs 方法重写(Override)

  • 重载:同一类中,方法名相同,参数列表不同。
  • 重写:子类中重新实现父类方法。

2. 什么时候用继承?

  • 符合 “is-a” 关系时(例如:Dog is a Animal)。
  • 避免过度继承(优先考虑组合而非继承)。

通过这三个特性,你可以设计出灵活、可维护的Java程序。建议结合代码实践,尝试自己编写一些类,体会它们之间的关系!


📜文末寄语

  • 🟠关注我,获取更多内容。
  • 🟡技术动态、实战教程、问题解决方案等内容持续更新中。
  • 🟢《全栈知识库》技术交流和分享社区,集结全栈各领域开发者,期待你的加入。
  • 🔵​加入开发者的《专属社群》,分享交流,技术之路不再孤独,一起变强。
  • 🟣点击下方名片获取更多内容🍭🍭🍭👇

相关文章:

  • 基于Partial Cross Entropy的弱监督语义分割实战指南
  • Python开发之os.path的常用操作
  • 2025年3月青少年机器人技术等级考试(二级)理论综合真题试卷
  • 【使用switch结构输出季节】2021-11-23
  • Wubuntu安装时创建分区失败解决方案
  • 贝叶斯定理
  • [python] 函数1-函数基础
  • uniapp index.html怎么改都不生效
  • Java 异常
  • 【PhysUnits】2 SI 量纲 实现解析(prefix.rs)
  • el-table合并单元
  • 数据结构(三)——栈和队列
  • uniapp-文件查找失败:‘@dcloudio/uni-ui/lib/uni-icons/uni-icons.vue‘
  • 记录一次华为魔改 fusionlnsight和ai问答的狗血故事
  • git 多个提交记录合并为一个
  • 为什么强调 RESTful 的无状态性?-优雅草卓伊凡
  • A2A Hello World搭建
  • CTF杂项入门(BUUCTF-Misc第一页)
  • 智能外呼机器人的核心优势
  • 手撕基于AMQP协议的简易消息队列-7(客户端模块的编写)
  • 溢价26.3%!保利置业42.4亿元竞得上海杨浦宅地,楼板价80199元/平方米
  • 康子兴评《文明的追求》|野人脚印:鲁滨逊的恐惧与文明焦虑
  • 美英达成贸易协议,美股集体收涨
  • 陕西澄城樱桃在上海推介,向长三角消费者发出“甜蜜之邀”
  • 甘怀真:天下是神域,不是全世界
  • 象屿集团:对去化压力大、市场有效需求不足区域坚决暂停投资,打造多元上市路径