Java 面向对象编程进阶三(封装)

目录

封装(encapsulation)

封装的作用和含义

封装的实现—使用访问控制符

public 访问权限修饰符:

protected 访问权限修饰符:

默认访问权限修饰符

private 访问权限修饰符

封装的一些处理


封装(encapsulation)

        封装是面向对象三大特征之一。对于程序合理的封装让外部调用更加方便,更加利于写 作。同时,对于实现者来说也更加容易修正和改版代码。

封装的作用和含义

        我要看电视,只需要按一下开关和换台就可以了。有必要了解电视机内部的结构吗?有 必要碰碰显像管吗?制造厂家为了方便我们使用电视,把复杂的内部细节全部封装起来,只 给我们暴露简单的接口,比如:电源开关。具体内部是怎么实现的,我们不需要操心。

        需要让用户知道的才暴露出来,不需要让用户知道的全部隐藏起来,这就是封装。说的专业一点,封装就是把对象的属性和操作结合为一个独立的整体,并尽可能隐藏对象的内部 实现细节。

        我们程序设计要追求“高内聚,低耦合”。 高内聚就是类的内部数据操作细节自己完成, 不允许外部干涉;低耦合是仅暴露少量的方法给外部使用,尽量方便外部调用。

编程中封装的具体优点:

  • 提高代码的安全性。
  • 提高代码的复用性。
  • “高内聚”:封装细节,便于修改内部代码,ᨀ高可维护性。
  • “低耦合”:简化外部调用,便于调用者使用,便于扩展和协作。

未进行封装:

class Person {
    String name;
    int age;
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
}
public class Test {
    public static void main(String[ ] args) {
        Person p = new Person();
        p.name = "李斯";
        p.age = -23;//年龄可以通过这种方式随意赋值,没有任何限制
        System.out.println(p);
    }
}

        我们都知道,年龄不可能是负数,也不可能超过 130 岁,但是如果没有使用封装的话, 便可以给年龄赋值成任意的整数,这显然不符合我们的正常逻辑思维。

        再比如说,如果哪天我们需要将 Person 类中的 age 属性修改为 String 类型的,你会怎么 办?你只有一处使用了这个类的话那还比较幸运,但如果你有几十处甚至上百处都用到了, 那你岂不是要改到崩溃。而封装恰恰能解决这样的问题。如果使用封装,我们只需要稍微修 改下 Person 类的 setAge()方法即可,而无需修改使用了该类的客户代码。

封装的实现—使用访问控制符

        Java 是使用“访问控制符”来控制哪些细节需要封装,哪些细节需要暴露的。 Java 中 4 种“访问控制符”分别为 private、default、protected、public,它们说明了面向对象的封装性, 所以我们要利用它们尽可能的让访问权限降到最低,从而ᨀ高安全性。

访问权限修饰符
修饰符同一个类同一个包中子类所有类
private
default
protected
public
  1. private 表示私有,只有自己类能访问
  2. . default 表示没有修饰符修饰,只有同一个包的类能访问
  3. protected 表示可以被同一个包的类以及其他包中的子类访问
  4. public 表示可以被该项目的所有包中的所有类访问

        下面做进一步说明 Java 中 4 种访问权限修饰符的区别:首先我们创建 4 个类:Person 类、Student 类、Animal 类和 Computer 类,分别比较本类、本包、子类、其他包的区别。

public 访问权限修饰符:

访问权限—本类中访问 public 属性

 public 访问权限—本包中访问 public 属性

public 访问权限—不同包中的子类访问 public 属性

public 访问权限—不同包中的非子类访问 public 属性

public 修饰符的访问权限为:该项目的所有包中的所有类。

protected 访问权限修饰符:

将 Person 类中属性改为 protected,其他类不修改。

protected 访问权限修改后的 Person 类

protected 访问权限,不同包中的非子类不能访问 protected 属性

protected 修饰符的访问权限为:同一个包中的类以及其他包中的子类。

默认访问权限修饰符

将 Person 类中属性改为默认的,其他类不修改

默认修饰符的访问权限为:同一个包中的类。

private 访问权限修饰符

将 Person 类中属性改为 private,其他类不修改。

封装的一些处理
  • 一般使用 private 访问权限。
  • 提供相应的 get/set 方法来访问相关属性,这些方法通常是 public 修饰的,以提供对 属性的赋值与读取操作(注意:boolean 变量的 get 方法是 is 开头!)。
  • 一些只用于本类的辅助性方法可以用 private 修饰,希望其他类调用的方法用 public 修饰。
public class Person {
    // 属性一般使用 private 修饰
    private String name;
    private int age;
    private boolean flag;
    // 为属性ᨀ供 public 修饰的 set/get 方法
    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;
    }
    public boolean isFlag() {// 注意:boolean 类型的属性 get 方法是 is 开头的
        return flag;
    }
    public void setFlag(boolean flag) {
        this.flag = flag;
    }
}

年龄非法赋值的问题

public class PersonTest {
    public static void main(String[ ] args) {
        Person p1 = new Person();
        //p1.name = "小红"; //编译错误
        //p1.age = -45; //编译错误
        p1.setName("小红");
        p1.setAge(-45);
        System.out.println(p1);
        Person p2 = new Person("小白", 300);
        System.out.println(p2);
    }
}
class Person {
    private String name;
    private int age;
    public Person() {
    }
    public Person(String name, int age) {
        this.name = name;
        // this.age = age;//构造方法中不能直接赋值,应该调用 setAge 方法
        setAge(age);
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setAge(int age) {
        //在赋值之前先判断年龄是否合法
        if (age > 130 || age < 0) {
            this.age = 18;//不合法赋默认值 18
        } else {
            this.age = age;//合法才能赋值给属性 age
        }
    }
    public int getAge() {
        return age;
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
}

​​​​​​​

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

蓝牙耳机哪个品牌最好?2024口碑绝佳蓝牙耳机推荐分享

​随着生活水平的不断提高&#xff0c;蓝牙耳机已成为我们生活中不可或缺的一部分。它为我们提供了极大的便利&#xff0c;无论是在听音乐、观看视频还是进行电话通话时。面对市场上种类繁多的蓝牙耳机&#xff0c;我为你整理了几款表现很不错的耳机产品&#xff0c;希望能帮助…

亚信安慧AntDB数据库分布式架构剖析之snapshot receiver进程

本文主要介绍亚信安慧AntDB数据库的分布式架构下的特有进程之snapshot receiver的设计&#xff0c;这也是分布式架构的核心进程之一。 进程简介 该进程的作用从逻辑上解释包含两个方面&#xff1a; 同步快照&#xff0c;并且是作为通信的client端存在 同步事务号&#xff0c;…

【博客7.4】缤果Qt5_TWS串口调试助手V2.0 (高级篇)

超级好用的Qt5_TWS耳机串口调试助手 开发工具: qt-opensource-windows-x86-5.14.2 (编程语言C) 目录 前言 一、软件概要&#xff1a; 二、软件界面&#xff1a; 1.App演示 三、获取 >> 源码以及Git记录&#xff1a; 总结 前言 串口调试助手支持常用的50bps - 10M…

MyBatisPlus 之四:MP 的乐观锁和逻辑删除、分组、排序、链式的实现步骤

乐观锁 乐观锁是相对悲观锁而言的&#xff0c;乐观锁假设数据一般情况不会造成冲突&#xff0c;所以在数据进行提交更新的时候&#xff0c;才会正式对数据的冲突与否进行检测&#xff0c;如果冲突&#xff0c;则返回给用户异常信息&#xff0c;让用户决定如何去做。 乐观锁适用…

WannierTools安装教程

wanniertools简单介绍 开源软件包WannierTools&#xff0c;是一个用于研究新型拓扑材料的软件。此代码在紧束缚模型中工作&#xff0c;可以由另一个软件包Wannier90生成。 它可以通过计算Wilson loop来帮助对给定材料的拓扑相进行分类&#xff0c;通过角分辨光电发射(ARPES)和…

掘根宝典之C++正向迭代器和反向迭代器详解

简介 迭代器是一种用于遍历容器元素的对象。它提供了一种统一的访问方式&#xff0c;使程序员可以对容器中的元素进行逐个访问和操作&#xff0c;而不需要了解容器的内部实现细节。 C标准库里每个容器都定义了迭代器&#xff0c;这迭代器的名字就叫容器迭代器 迭代器的作用类…

后端系统开发之——创建注册接口

原文地址&#xff1a;后端系统开发之——创建注册接口 - Pleasure的博客 下面是正文内容&#xff1a; 前言 这是一篇SpringBoot项目的实践篇。 主要用于介绍如何从零开始搭建某一种类型的系统。 个人认为&#xff0c;只要后端逻辑完善了&#xff0c;纵使前端页面千变万化都可…

硬件基础:带缓启动MOS管电源开关电路

电源开关电路&#xff0c;经常用在各“功能模块”电路的电源通断控制&#xff0c;是常用电路之一。 本文要讲解的电源开关电路&#xff0c;是用MOS管实现的&#xff0c;且带缓开启功能&#xff0c;非常经典。 一、电路说明 电源开关电路&#xff0c;尤其是MOS管电源开关电路…

2024-3-18-C++day6作业

1>思维导图 2>试编程 要求: 封装一个动物的基类&#xff0c;类中有私有成员&#xff1a;姓名&#xff0c;颜色&#xff0c;指针成员年纪 再封装一个狗这样类&#xff0c;共有继承于动物类&#xff0c;自己拓展的私有成员有&#xff1a;指针成员&#xff1a;腿的个数&a…

蓝桥杯-24点-搜索

题目 思路 --暴力递归全组合的方法。只有4个数&#xff0c;4种计算方式&#xff0c;共有4 * 3 * 2 * 1 * 4种不同的情况&#xff0c;可以写递归来实现。 --每次计算都是两个数之间的运算&#xff0c;因此4个数需要3次计算&#xff0c;第一次计算前有4个数&#xff0c;第二次有…

Mysql与MyBatis

1 Sql语句 增删改查 1.1 建表 -- cmd展示数据库 show databases ; -- cmd登录数据库 mysql localhost -u root -p-- auto_increment 自动增长&#xff0c;每添加一个表项id自动增1 -- char定长字符串 0-255&#xff0c;不足十个字符按十个字符算&#xff0c; varchar变长字符串…

阿里云服务器“地域”,这么选择就对了!

阿里云服务器地域选择方法&#xff0c;如何选择速度更快、网络延迟更低的地域节点&#xff0c;地域指云服务器所在的地理位置区域&#xff0c;地域以城市划分&#xff0c;如北京、杭州、深圳及上海等&#xff0c;如何选择地域&#xff1f;建议根据用户所在地区就近选择地域&…

预防近视的台灯有哪些?多款专家说好的护眼台灯推荐

现在的儿童青少年近视率真的非常高&#xff01;据统计&#xff0c;我国儿童青少年的总体近视率为52.7%&#xff0c;其中6岁儿童为14.3%&#xff0c;小学生为35.6%&#xff0c;初中生为71.1%&#xff0c;高中生为80.5%。而造成如此高近视率的原因主要还是长时间过度用眼导致的疲…

【Qt问题】使用QSlider创建滑块小部件无法显示

问题描述&#xff1a; 使用QSlider创建滑块小部件用于音量按钮的时候&#xff0c;无法显示&#xff0c;很奇怪&#xff0c;怎么都不显示 一直是这个效果&#xff0c;运行都没问题&#xff0c;但是就是不出现。 一直解决不了&#xff0c;最后我在无意中&#xff0c;在主程序中…

LabVIEW飞行器螺旋桨性能测试与数据监控

LabVIEW飞行器螺旋桨性能测试与数据监控 开发LabVIEW的电动飞行器螺旋桨性能测试与数据监控系统&#xff0c;专门针对电动飞行器螺旋桨在运行过程中的性能测试和监控需求。通过采集转速、转矩、拉力和温度等关键参数&#xff0c;系统能够实时监测和分析螺旋桨的状态&#xff0…

AI - 集成学习

目录 集成学习概念 集成学习器性能评估 随机森林 AdaBoost &#x1f606;&#x1f606;&#x1f606;感谢大家的阅读&#x1f606;&#x1f606;&#x1f606; 集成学习概念 &#x1f48e;集成学习是机器学习中的一种思想&#xff0c;它通过多个模型的组合形成一个精度…

【Spring MVC】Spring MVC拦截器(Interceptor)

目录 一、拦截器介绍 二、拦截器 Interceptor 定义 2.1 HandlerInterceptor接口 2.2 Spring MVC中提供的一些HandlerInterceptor接口实现类 1、AsyncHandlerInterceptor 2、WebRequestInterceptor 3、MappedInterceptor 4、ConversionServiceExposingInterceptor 三、拦…

力扣题单(小白友好)

力扣题单 算法小白自用题单,目前对于一些简单的数据结构感觉掌握的还可以,但是力扣很多题还是需要看题解,不够熟练;故整理了一份题单,用于巩固练习; 网上确实有很多对于算法分类讲解的网站,but:有一丢丢选择困难症,每天不知道该刷什么题,再加上网站对于一类题一般就有十几道题目…

人工智能技术的不当利用与风险

目录 前言1 视频篡改技术的滥用1.1 虚假信息传播与社会动荡1.2 对公众信任的破坏与舆论混乱 2 隐私泄露与监视风险2.1 个人信息安全与数据滥用风险2.2 社会稳定与个人自由权利的平衡 3 虚假评论与信息传播3.1 舆论操纵与社会意识形态的影响3.2 对信息可信度与公众信任的威胁 结…

雷龙发展Nand flash芯片试用体验

一、项目背景 最近自己开始准备了一个智能家居控制系统项目,需要包含室内的温湿度、空气质量、烟雾浓度以及气体含量,能够存储相应的数据,并进行显示。 Nand-flash存储器是flash存储器的一种,其内部采用非线性宏单元模式,为固态大容量内存的实现提供了廉价有效的解决方案…