面向对象的封装

news2025/2/11 11:40:51

9. 面向对象特征一:封装性(encapsulation)

什么是封装
就像快递一样我们在网上买的物品,快递都会给我们添加外包装,给我们封装起来,这就是封装

客观世界里每一个事物的内部信息都隐藏在其内部,外界无法直接操作和修改,只能通过指定的方式进行访问和修改。

9.1 为什么需要封装?

随着我们系统越来越复杂,类会越来越多,那么类之间的访问边界必须把握好,面向对象的开发原则要遵循“高内聚、低耦合”。

高内聚、低耦合是软件工程中的概念,也是 UNIX 操作系统设计的经典原则。
内聚,指一个模块内各个元素彼此结合的紧密程度;
耦合指一个软件结构内不同模块之间互连程度的度量。耦合意味着牵一发动全身。
内聚意味着重用和独立,耦合意味着牵一发动全身

而“高内聚,低耦合”的体现之一:
• 高内聚:类的内部数据操作细节自己完成,不允许外部干涉;
• 低耦合:仅暴露少量的方法给外部使用,尽量方便外部调用。

“高内聚、低耦合”:其实就是代码之间的相互影响降到最低;

9.2 何为封装性?
所谓封装,就是把客观事物封装到一个类里,并且类可以把自己的数据和方法指定可信的类或者对象开放,向没必要开放的类或者对象隐藏信息。

**通俗的讲,把该隐藏的隐藏起来,该暴露的暴露出来。这就是封装性的设计思想。**

我们通过使用private修饰封装了属性值那么我们如何获取呢通过get set方法

package com.tedu;

public class Test1 {

    public static void main(String[] args) {
Anamail anamail=new Anamail();
//当我添加private修饰符的时候这个地方会报错
//        anamail.name="姚明";
//        anamail.age=33;


        /*
        System.out.println(anamail.name);
        System.out.println(anamail.age);
        */

        anamail.setAge(2);
        System.out.println(anamail.getAge());

        anamail.eat();
    }

}

class  Anamail{

    String name;

    //如果我们在这里不添加private修饰符可以直接调用
    private int age;

public  void eat(){

    System.out.println("今天吃的啥");
}


//set方法是专门用来给属性设置值
    public void setAge(int a){
    //大于等于0的偶数
    if (age>=0 && age % 2==0){
        age=a;
    }else {
        System.out.println("你打印的值是非法的");
    }

    }

    //get方法是用来给属性获取值
public  int getAge(){

     return age;
}

}


请添加图片描述

9.3 Java 如何实现数据封装
• 实现封装就是控制类或成员的可见性范围。这就需要依赖访问控制修饰符,也称为权
限修饰符来控制。
• 权限修饰符:public、protected、默认(default)、private。具体访问范围如下

在这里插入图片描述

TIPS:default是表示不写修饰符,默认,如果写default单词来修饰会报错

注意:类只能使用public 、默认(default)修饰,
类的成员这几种修饰符都可以使用

4.3.2 练习:封装学生案例

创建包: cn.tedu.oop
创建类: TestPrivate2.java

package cn.tedu.oop;

/*本类用于练习OOP的第一大特性:封装*/
public class TestPrivate2 {
    public static void main(String[] args) {
        //4.创建学生类对象s
        Student s = new Student();
        //5.通过对象修改并查看属性值
        s.sno = 1;
        //s.name = "黄飞鸿";
        //s.subject = "Java培优";
        System.out.println(s.sno);
        //System.out.println(s.name);
        //System.out.println(s.subject);
        //6.通过对象调用方法
        s.study();
        s.eat();
        s.sleep();
        //7.3使用刚刚生成的set()设置值方法与get()获取值方法
        s.setName("十三姨");
        s.setSubject("美容美发");
        System.out.println(s.getName());
        System.out.println(s.getSubject());
    }
}

//1.定义类描述学生这一类型Student
class Student {
    //2.特征:学号sno 姓名name 科目subject
    //7.1 封装属性--用private修饰属性
    int sno;
    private String name;
    private String subject;

    //7.2提供被封装属性的get与set方法
    //右键->Generate->Getter and Setter->Shift选择属性->OK
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    //3.定义学生的功能:学习 吃饭 睡觉
    public void study() {
        System.out.println("正在学习中...");
    }

    public void eat() {
        System.out.println("吃饭ing...");
    }

    public void sleep() {
        System.out.println("我一点也不想睡觉,就想学Java!");
    }
}

4.3.3 练习:封装方法测试

创建包: cn.tedu.oop
创建类: TestPrivate3.java

package cn.tedu.oop;
/*本类用于测试方法的封装*/
public class TestPrivate3 {
    public static void main(String[] args) {
        //4.创建对象测试
        Apple a = new Apple();
        //5.没有封装方法时,调用没有限制
        //a.eat();//封装eat(),此处调用报错
        a.clean();
    }
}
//1.创建苹果类
class Apple{
    //2.定义方法1
    public void clean(){
        System.out.println("苹果还是要洗洗的~");
        //6.在已有的公共方法clean()中调用被封装eat()方法的功能
        eat();
    }
    //3.定义方法2
    private void eat(){
        System.out.println("要吃苹果啦~");
    }
}

5 拓展:OOP综合练习

创建包:cn.tedu.oop
创建类:TestCar

package cn.tedu.oop;
/*本类用于面向对象的巩固练习*/
public class TestCar {
    //创建程序的入口函数main()
    public static void main(String[] args) {
        //3.创建汽车类对象c
        Car c = new Car();
        //4.通过汽车类对象c设置属性值
//        c.color = "暗夜紫";
//        c.brand = "BMW";
//        c.price = 200;
//        c.length = 0.2;
        //5.查看刚刚设置好的属性值
//        System.out.println(c.brand);
//        System.out.println(c.price);
//        System.out.println(c.color);
//        System.out.println(c.length);
        //6.通过c对象调用汽车类的方法
        c.start();
        //c.stop();
        //7.3调用提供的set与get方法,设置并获取对应属性的值
        c.setBrand("特斯拉");
        c.setColor("black");
        c.setPrice(200.02);
        c.setLength(3);
        System.out.println(c.getBrand());
        System.out.println(c.getColor());
        System.out.println(c.getLength());
        System.out.println(c.getPrice());
        //8.3 调用公共方法来实现私有方法功能的使用
        c.start();
    }
}
//1.抽象汽车这一类事物的属性与行为,封装成一个类组件
class Car{
    //2.属性--用成员变量来描述
    //7.1封装所有的属性值--使用private修饰
    private String color;
    private String brand;
    private double price;
    private double length;
    //7.2 生成所有属性的get与set方法
    /*右键空白处->Generate->Getter and Setter->按住Shift全选所有属性生成即可*/
    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public double getLength() {
        return length;
    }

    public void setLength(double length) {
        this.length = length;
    }

    //3.行为--用方法来描述
    //8.2 可以在本类公共的方法里,调用私有方法
    public void start(){
        System.out.println("汽车开动了~");
        stop();//我们通过方法名+参数列表确定要调用哪个方法
    }
    //8.1封装方法,通过private修饰符
    private void stop(){
        System.out.println("汽车停止了~");
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/640131.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怎样才算一个计算机知识体系完整的毕业生

为什么突然想写这个话题呢? 最近有不少新关注的读者,在后台问:大学学 Java 和 C 哪个好找工作,学前端好还是后端好,该学 Vue 还是 React。。。 仿佛看到了自己当年的模样,所以觉得有必要单独写一篇文章&a…

CSS基础学习--8 盒子模型(Box Model)

一、介绍 所有HTML元素可以看作盒子,在CSS中,"box model"这一术语是用来设计和布局时使用。 CSS盒模型本质上是一个盒子,封装周围的HTML元素,它包括:边距,边框,填充,和实…

调用阿里API实现图片中的文字识别

作者介绍 王雪玉,女,西安工程大学电子信息学院,2022级研究生 研究方向:机器视觉与人工智能 电子邮件:2239580540qq.com 王泽宇,男,西安工程大学电子信息学院,2022级研究生&#xf…

网规例题(二)

解题思路: 1.发送150000字节大小IP报文 数据帧长1518字节 首部18字节 可用数据1500字节 因此需要发送 100个数据帧 1518字节 1518*8 bit 带宽10 Mb/s 10 000 000 bps (一)发送100个数据帧的发送时延 0.12144 秒 (二&#…

Java程序员不得不知道的一些设计模式

1、什么是设计模式 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢…

【arXiv2303】Learning with Explicit Shape Priors for Medical Image Segmentation

Learning with Explicit Shape Priors for Medical Image Segmentation, aXiv2303 解读:SPM: 一种即插即用的形状先验模块,可轻松嵌入任意编解码架构,助力涨点并显著改善分割效果! (qq.com) 论文:https://arxiv.org/…

基于Air103的DAP-link的硬件介绍

原文及固件链接 视频介绍链接 xkb7070-z 自锁式按键 上电开关 WAFER-SH1.0-6PWB 1.0间距卧贴插座 下载及通信接口 A2-4PA-2.54DS 4Pin接插件 纯下载接口 Air32F103CBT6 lqfp48 216MHz 256K Flash 32K RAM UD/UD- DP&DM信号 USB的差信号 R1 DIO监听 限流 PM254-2-04-W…

【3DsMAX】从零开始建房(7)

目录 1. 制作屋顶小船剩余部分 2. 制作小广告牌 1. 制作屋顶小船剩余部分 新建一个平面 长度分段设置为1 转换成可编辑多边形后,对边进行缩放 同样的方法再添加一个平面 添加“壳” 新建一个圆柱体作为桅杆 选中圆柱的底面,点击插入 挤出 将顶部的点缩…

深入理解深度学习——Transformer:编码器(Encoder)部分

分类目录:《深入理解深度学习》总目录 Transformer中的编码器不止一个,而是由一组 N N N个编码器串联而成。一个编码器的输出作为下一个编码器的输入。在下图中有 N N N个编码器,每一个编码器都从下方接收数据,再输出给上方。以此…

7年测试经验之谈,什么是模糊测试?

背景:近年来,随着信息技术的发展,各种新型自动化测试技术如雨后春笋般出现。其中,模糊测试(fuzz testing)技术开始受到行业关注,它尤其适用于发现未知的、隐蔽性较强的底层缺陷。这里&#xff0…

类的多继承的派生类的虚表的一些问题

虚表保存的其实并不是虚函数的地址,而是他的到jmp地址。 上我们的操作代码 class A { public:virtual void func1(){}virtual void func2(){}int a 1; };class B { public:virtual void func1(){}virtual void func2(){}int b 2; };class C : public A, public …

SAP HANA内存

用着用着HANA 数据库就慢了,原因都出在内存。 内存不足无非几个原因: 1.你的机器物理内存不足,这个好办,花钱扩。 2.你的HANA License容量不足,这个也好办,申请更大容量的内存License 3.你机器分配给HAN…

爬虫案例-使用Session登录指定网站(JS逆向AES-CBC加密+MD5加密)

总体概览:使用Session登录该网站,其中包括对password参数进行js逆向破解 (涉及加密:md5加密AES-CBC加密) 难度:两颗星 目标网址:aHR0cHM6Ly93d3cuZnhiYW9nYW8uY29tLw 下面文章将分为四个部分…

在后大流行时代利用Airbnb实现逆周期增长

回望近十年共享经济的发展历程,谁也不曾想到,最被看好的共享经济代表Uber竟在连年亏损后忍痛IPO,上市首日即破发,而主打「互联网房地产」模式的独角兽WeWork则上市失败,迅速失血,一度走到破产边缘。作为“共…

模型剪枝:Network Slimming剪枝实战

本文来自公众号“AI大道理” ​ Network Slimming剪枝是比较广泛的一种模型剪枝方法,作者来自清华大学、英特尔中国实验室、复旦大学和科内尔大学。 1、Network Slimming剪枝理论 Network Slimming剪枝是结构性剪枝,是通道剪枝,是静态剪枝…

mac安装hive_20230609

竟然是今年第一篇 hhhh 过两天把上半年的东西梳理好的话 陆续放上来吧~ 公司本地测试环境的hive版本不支持不等式关联操作,而现在用hive也比较多,所以在本地装了一个hive,主要写一下大致步骤和过程中遇到的问题~&#…

win10任务栏卡死解决

现象: win10 更新后,开机任务栏卡死,点开始反应,设置页面无法打开。 原因: 原因是Win10更新的任务栏资讯和兴趣,而资讯和兴趣是Edge浏览器的,该服务器是在国外,国内的网络加载不出来…

【lvs集群】HAProxy搭建Web集群

HAProxy搭建Web集群 一、 HAProxy简介1.1HAProxy主要特性1.2HAProxy负载均衡策略非常多,常见的有如下8种1.3LVS、Nginx、HAproxy的区别1.4常见的Web集群调度器 二、Haproxy搭建 Web 群集haproxy服务器部署节点服务器部署 三、定义监控页面与定义日志3.1定义监控页面…

stm32f103最小系统板详细介绍

一.什么是单片机最小系统 常见的单片机最小系统为单片机能独立运行程序及控制外围电路的最简单电路,主要由单片机、晶振电路、复位电路三部分构成。Stm32f103c8t6也不例外,构成最小的运行电路也需要以上三部分。 Stm32f103最小系统板原理图如下&#xf…

初始Sentinel(Sentinel的简单介绍及项目整合)

前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将详细介绍Sentinel的概念,优点,与Hystrix的对比以及微服务中整合Sentinel,后续文章将详细介绍Sentinel的细节部分。 如果文章…