53-Java面向对象:封装

本文探讨了封装在面向对象编程中的核心作用,通过实例演示如何设计人、圆和门对象,并强调了封装思想带来的简化编程和降低学习成本的优势。随后深入讲解了如何进行更好的封装,如使用getter和setter保护数据,以年龄验证为例。重点总结了封装原则和优化技巧。
摘要由CSDN通过智能技术生成

一、封装

1. 面向对象的三大特征

  • 封装、继承、多态

2. 它是什么

  • 封装:告诉我们,如何正确设计对象的属性和方法。

  • 封装的原则:对象代表什么,就得封装对应的数据,并提供数据对应的行为

4. 结合生活实际,理解封装思想

  • 需求一:

    • 请设计一个:人对象,且要求这个对象有:名称、年龄,能吃饭、睡觉
      在这里插入图片描述

    • 相信这个大家都会设计

  • 需求二:
    在这里插入图片描述

    • 请针对这个需要面向对象设计

    • 分析:

      1. 涉及到2个对象:人、圆;
      2. 因为需求是人画圆,这属于一种行为,因此需要在圆对象里封装画圆的数据以及画圆的行为方法,提供给人使用,完成人画圆;
      3. 圆对象的成员变量:圆半径;成员方法:画圆。
    • 实现:
      在这里插入图片描述

  • 需求三:
    在这里插入图片描述

    • 请针对这个需求面向对象设计

    • 分析:

      1. 涉及到2个对象:人、门;
      2. 因为需求人关门,这属于一种行为,因此需要在门对象里封装关门的行为方法,提供给人使用,完成人关门
      3. 门对象:成员方法:关门
    • 实现:
      在这里插入图片描述

  • 如果以上还不能理解的话,那就再举一个例子:

    • 需求:
      在这里插入图片描述

    • 请根据这个需求面向对象设计:

      1. 就问张三砍死了李四,是张三死亡,还是李四死亡?

        答:肯定是李四死亡。

      2. 那么死亡的方法是定义在张三,还是定义在李四?

        答:肯定是定义在李四。

      3. 那么用程序员的思想怎么理解这个杀人案件?

        答:是张三 调用了 李四的死亡方法,致使李四死亡。

5、理解封装思想的好处

  • sum公司在开发Java编程语言的时候,已经写了各种各样的对象,这些对象,方便我们程序员用来解决实际开发中的业务问题
    在这里插入图片描述

  • 举个例子:sum公司知道对字符串的操作是很常见的,所以,就给我们程序员提供了一个代表字符串的对象
    在这里插入图片描述

  • 有啥事?找对象,调用方法就行,传参数就行,编程变得很简单

  • 降低我们的学习成本,可以少学、少记一点,用的时候,看一下文档就好了

重点总结

1、什么是封装?

  • 告诉我们,如何正确的设计对象的属性和方法
  • 对象代表什么,就得封装对应的数据,并提供数据对应的行为

2、理解封装思想有哪些好处?

  • 有啥事,直接找对象,调用对象方法、传参就行,编程变得很简单
  • 大大降低我们的学习成本,可以少学、少记一点,用的时候,找一下对象就行了

二、优化封装

1. 如何进行更好的封装

  • 一般建议对成员变量使用private(私有、隐藏)关键字修饰进(private修饰的成员只能在当前类中访问)。

    • 这种写法,在实际开发中,非常的不好,不推荐使用
      在这里插入图片描述

    • 使用private关键字修饰的成员只能在当前类中访问
      在这里插入图片描述

    • 就好比,你现实中刚认识一个妹子,她不可能一下子就给你暴露她的年龄或者隐私吧!

  • 合理暴露:为每个成员变量提供配套public修饰的getter、setter方法,暴露其取值和赋值。

    • 像这样,通过getAge方法给我们取值;通过setAge方法给我们赋值,并且对所赋值进行一些合法判断
      在这里插入图片描述

2. 优化封装小案例

  • 需求:录入学生年龄并判断年龄是否正常

    • 学生类

      package com.app.encapsulation;
      
      // 学生类
      public class Student {
          // 1.成员变量: 姓名、年龄,使用private修饰——只能在本类中访问
          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) {
              // 判断年龄是否正常
              if (age >= 0 && age <= 200) {
                  // 年龄正常
                  this.age = age;
              }else {
                  System.out.println(this.name + "的年龄不正常!!");
              }
          }
      }
      
    • 实现类

      package com.app.encapsulation;
      
      /**
          目标:学习如何进行更好的封装
       */
      public class StudentTest {
          public static void main(String[] args) {
              // 创建学生对象,录入学生信息
              Student stu1 = new Student();
              stu1.setName("赵云");
              stu1.setAge(99);
              // 查看学生年龄
              System.out.println(stu1.getName() + "的年龄是" + stu1.getAge());
      
              System.out.println("-------------------------");
              Student stu2 = new Student();
              stu2.setName("关羽");
              stu2.setAge(999);
      
              System.out.println(stu2.getName() + "的年龄是" + stu2.getAge());
          }
      }
      
    • 控制台

      赵云的年龄是99
      -------------------------
      关羽的年龄不正常!!
      关羽的年龄是0
      
      Process finished with exit code 0
      
      
    • 可以看到,赵云的年龄经过setAge方法的判断是正常范围,所以可以正常赋值,输出是赋值后的数据

    • 关羽的年龄经过setAge方法的判断不是正常范围,所以不可以进行赋值,输出的是默认值

重点总结

1、如何进行更好的封装?

  • 一般会把成员变量使用private隐藏起来,对外就不能直接访问了
  • 为每个成员变量提供public修饰的getter、setter方法,暴露其取值和赋值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值