Java——封装——Encapsulation

news2024/10/7 8:23:35

封装

  • 什么是封装
  • 访问权限修饰符
  • 导入import一个包package?
  • Static到底是什么

面向对象的三大特征:封装、继承、多态。今天我们来浅谈一下封装。

什么是封装

我们不用那么专业那么难懂的语言讲解,我们就走一波野路子:封装就是指用private 这个访问权限修饰符 修饰类中的成员或者方法,使被修饰的信息只能在其所在的类中看到具体的实现。
就相当于,你不需要知道为什么一加一等于二,你只要会计算就可以了。

    class Person{
        private int age;
        private String name;
        private String sex;

我们在这里抽象出来人这个类,不妨想成一下这是一个女人,随意询问一位女士的年龄之类的信息是非常失礼的,因此我们把这个类中的三个属性用private 修饰一下。
现在我们再来试一下礼貌性地搭讪:
在这里插入图片描述
看来我们被很明确地拒绝了……
虽然我们没有搭讪成功,但是至少我们见识到了封装的力量!那请问:如果我们的封装就只是为了不让我们使用数据,那为什么不直接不写这个数据呢?
首先,我们封装的意义只是为了不让类中的信息被外人所窥探,比如这个类中有哪些属性,比如这个类中实现了哪些方法……但是出于人道主义,我们一般会在使用private的同时,给程序的使用着提供一个get/set接口 这样子使用者就可以在不清楚程序的具体实现的情况下获得/设置被封装的内容了!

    public Person(int age, String name, String sex) {
        this.age = age;
        this.name = name;
        this.sex = sex;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }


}

兄弟们可千万不要以为以后我们每使用一次类都要写上这么多的代码啊,写代码又不是八股文。没有那么多凡尘俗套:
在这里插入图片描述
在这里插入图片描述
鼠标右键,然后慢慢点就行了,我们的Ideal会帮助我们实现构造方法以及接口的!赞美伟大的Ideal开发者!!

        Person person=new Person(20,"cyt","man");
//        System.out.println(person.name);
        System.out.println(person.getName());
        person.setName("qxy");
        System.out.println(person.getName());

再来看一下接口的使用:
在这里插入图片描述
这样子我们就做到了封装的属性与用户之间的交互!
对于现实生活中,授人以渔不如授人以鱼,我要是把王者荣耀的代码给你了,我还怎么挣钱啊!!

访问权限修饰符

四种修饰符权限从小到大依次是:
private<default(默认的包访问权限)<protected<public
public很开放,只要是一个Java文件里面的都是可以是使用的。
protect只能是在一个包中或者不同包但是存在继承关系的情况下访问。
default不是一个修饰符名称,而是指在我们不加以修饰符的时候,默认的修饰权限就是在一个包里面。
private比较腼腆,只能在它所在的类中访问,出了这个类一概不熟!!
现在我们还没有接触到继承的知识,所以先不加以讨论,在这里我本可以随便敲几行代码,随便截几张图,这样可以水不少字数,但是谁让阿涛我人心善呢,我直接教兄弟们如何在Ideal上面分辨:
在这里插入图片描述
在这里插入图片描述
一个包就相当于是一个文件夹,里面可以放好多的类,我们可以通过New Package来创建一个又一个包,我们说的包访问权限就是指着在这一个文件夹下面的那么多类中,被包访问权限修饰符修饰的都是可以畅通无阻地使用的,而我们说的类就是指的前面有c 标识的。

导入import一个包package?

就在刚刚我们似乎说到了一关于包的知识,其实对于包我们并不是那么陌生,我们一直都是在潜移默化地使用着:
在这里插入图片描述
注意看现在上面什么都没有:
在这里插入图片描述
之前我们讲过Java中地输入,其中就提到了这个,通常来说我们的Sca还没数完Ideal就会智能提示我们,我们只需要按下回车键,Scanner和最上面的那一行都自动填充好了。
现在再来说一水:包里面其实存放的是好多好多的类,而类中又会有好多好多的方法,对于我们的Java来说一切皆对象,我们有的时候根本不需要自己去动手写一些方法,前人之述备矣,我们需要做的就是学习这些方法的使用,并且确保我们在打开前辈的知识宝库的之前,导入了对应包中的类即可!
所以我们导入的并不是包,而是包中的类!!!
当然了,一般情况下是不需要我们自己可以去记忆我们要使用的类在哪个类里面,这个类又在哪个方法里面,这样子对于解放程序猿的双手也太不友好了!当然了,如果我们是在不乐意去导包,那就只能为委屈一下自己了:

    java.util.Scanner scanner=new Scanner(System.in);

这样子虽然不错,但是不太正规,你懂我意思吧……

Static到底是什么

大名鼎鼎的psvm中的s就是这里的static,static代表着静态的。

    private int age;
    private String name;
    private String sex;
    public String country="China";

这里我们加上一个国籍:
在这里插入图片描述
我们通过调试可以看到这个person的具体的信息,可以看到此时我们的国籍还是属于person指向的对象的。那么现在呢:

    public static String country="China";
    

在这里插入图片描述
看到没,这个国籍就这么硬生生没了。其实不是没了,只是不再属于我们的对象了,静态的属性和方法此时不是属于某一个对象的,而是属于有这个类创建出来的所有对象的,也可以说是属于类的了!不信你看:
在这里插入图片描述
刚才我偷偷把sex这个类的权限改了一下,给兄弟们打个样!我们可以通过person引用访问到sex这个属性,但是没有办法直接通过Person这个类名访问到sex,可是我们可以通过Person直接访问到country这个被static修饰的静态属性。接下来我们再来看点骚的:
在这里插入图片描述
在这里插入图片描述
我们试图通过引用访问静态成员属性,此时编译器并没有给我们提示,但是我们自己如果强行输完,此时是不会报错的。我想这也算是编译器想表达的一种态度吧:不遵守规则的人我凭什么给你便利呢?
在这里插入图片描述
经典之我抄我自己,这是我在前几篇博客的时候手绘的,算不得侵权!之前我们说过,我们new出来的对象都是放在堆上的,那我们对象中的成员属性也沾了光放到了堆上,但是成员方法本身是放在了内存中的代码段里面,只有调用方法的时候才会给它们分配内存,而我们的静态成员属性则是被放到了方法区上面。
根据我们静态方法的性质我们可以这么说:我们的静态属性啊,方法啊,都是不依赖对象的,可以直接通过类名给它点出来,但是普通的成员方法就没有那么自由了,她=他们都是依赖对象的。那么问题来了:我们可不可以在非静态的方法中调用静态的属性呢?
我们也不燃那些繁琐的概念,我们就抓住一点,我们的静态属性是不依赖对象的,如果放在了一个非静态方法的内部,那是不是就和它一荣俱荣一损俱损了?所以我们说,我们是不可以在一个非静态的方法中访问一个静态的成员的。翻过来我们可以在静态方法中访问非静态的属性吗?理论上应该不可以的,因为我们的静态方法是不需要通过new对象来实现的,但是如果我们真的就在静态方法中new上一个对象,还是可以勉强使用非静态的方法的,但是这就有点刻意为了非静态而静态了……

最后在给兄弟们补充一点算作的离别的小礼物:

        Person person1=new Person();
        System.out.println(Person.country);
        Person.country+=1;
        System.out.println(Person.country);
        Person person2=new Person();
        System.out.println(Person.country);
        Person.country+=2;
        System.out.println(Person.country);

兄弟们看了这个代码是不是会一眼以为不就是国籍后面分别加上一和二,对不对,我们来见证奇迹!
在这里插入图片描述
看到没,有没有感觉虽然我们new了那么多个对象,但好像就在实际上效果上其实我们都是在对同一个country进行操作?这就是阿涛最后想讲的,我们的静态属性只会在方法区内部储存一份,只要我们使用到了静态方法,那么无论使用几次,都是操作的同一份!
好了,希望我的这篇博客能够帮助到兄弟们!
百年大道,你我共勉!!

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

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

相关文章

理想汽车季报图解:营收93亿运营亏损21亿 沈亚楠卸任总裁职务

雷递网 雷建平 12月9日理想汽车&#xff08;纳斯达克&#xff1a;LI&#xff1b;香港交易所&#xff1a;2015&#xff09;今日公布财报。财报显示&#xff0c;理想汽车2022年第三季度营收93.4亿元&#xff08;13.1亿美元&#xff09;&#xff0c;较上年同期的77.8亿元增长20.2%…

【考研数据】一.2020年BJTU计算机学院考研录取数据分析

欢迎订阅本专栏:《北交计算机复试经验》 订阅地址:https://blog.csdn.net/m0_38068876/category_12110003.html 【考研数据】一.2020年BJTU计算机学院考研录取数据分析【考研数据】二.2021年BJTU计算机学院考研录取数据分析【考研数据】三.2022年BJTU计算机学院考研录取数据分…

vue.js:父子组件的实训案例watch实现

作业需求 需求1&#xff1a;定义两个输入框&#xff0c;通过输入框输输入的值改变页面显示的值需求2&#xff1a;改变第一个输入框的值的同时使得第二个输入框的值变为100倍并显示需求3&#xff1a;改变第二个输入框的值的同时使得第一个输入框的值变为1/100并显示用watch实现…

Redis 特性。

Remote Dict Serve 分类 实时同步数据 要求缓存中的数据必须与db中的数据保持一致&#xff0c;如何保证&#xff0c;只要DB发生了变化&#xff0c;缓存中的数据立即消息 阶段性缓存为了缓存数据 添加了生存时长属性 Redis 的特性。 性能极高 读的速度 11w/s 写的速度 8w次/s…

10.spring源码之registerListeners()

1. 准备 ApplicationEvent: 事件对象&#xff0c;Spring事件驱动模型中的对象源&#xff0c;继承JDK EventObject&#xff0c;通过在发布事件时通过EventObject.source字段携带事件相关的数据。 ApplicationListener: 应用监听器&#xff0c;负责监听事件对象是否有发生变化&a…

学习Java8 Stream流,让我们更加便捷的操纵集合

1. 概述 本篇文章会简略的介绍一下 Lambda 表达式&#xff0c;然后开启我们的正题 Java8 Stream 流&#xff0c;希望观众老爷们多多支持&#xff0c;并在评论区批评指正! Java8 的 Stream 流使用的是函数式编程模式。它可以被用来对集合或数组进行链状流式的操作&#xff0c;…

推荐系统基本问题及系统优化路径

省时查报告-专业、及时、全面的行研报告库省时查方案-专业、及时、全面的营销策划方案库【免费下载】2022年10月份热门报告盘点大规模推荐类深度学习系统的设计实践.pdf荣耀推荐算法架构演进实践.pdf推荐系统在腾讯游戏中的应用实践.pdf清华大学256页PPT元宇宙研究报告.pdf&…

产品设计杂感

概述 前面多篇文章提过我近一年以来几乎是一个人在负责一款数据产品&#xff0c;一款公司内部使用的报表开发工具。市面上的类似产品如Tableau&#xff0c;QuickBI等。工作角色&#xff08;职责&#xff09;包括&#xff1a;后端开发&#xff0c;前端开发&#xff0c;功能测试…

STM32 bootloader简单实现的验证

目录 背景知识 STM32的启动模式 Flash memory的大小 实验验证 分区分配 bootloader代码 systeminit 背景知识 STM32的启动模式 STM32有三种启动模式, 这里验证的bootloader是通过Flash memory启动方式, 使用STM32内置的Flash,其首地址是0x08000000&#xff0c;一般我们…

[论文阅读] 颜色迁移-梯度保护颜色迁移

[论文阅读] 颜色迁移-梯度保护颜色迁移 文章: [Gradient-Preserving Color Transfer], [代码未公开] 本文目的: 如题所示为梯度保护的颜色迁移方法. 1-算法原理 人类的视觉系统对局部强度差异比强度本身更敏感, 因而, 保持颜色梯度是场景保真度的必要条件, 因而作者认为: 一…

python+django留守儿童爱心捐赠网站

开发语言&#xff1a;Python 框架&#xff1a;django Python版本&#xff1a;python3.7.7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;PyCharm 目录 1 绪论 1 1.1课题背景 1 1.2课题研究现状 1 1.3初步设计方法与实施方案 2 1.4本文研究…

城市应急处置系统实施目标

针对需求分析中的业务目标&#xff0c;本系统在实施中&#xff0c;通过 “两个工作台七个子系统”的目标来支撑业务目标&#xff0c;满足系统延续需求、功能需求、制度建设需求、平台拓展需求和技术性能需求。 具体分为事前6个子系统、事中2个工作台和事后1个子系统这三方面目标…

002:UIView

UIView简介&#xff1a; UIView作为最基础的视图类&#xff0c;起着管理屏幕上一定区域内容展示的作用。作为各种视图的父类&#xff0c;提供相应的基础能力。 外观、渲染和动画。相应区域内的事件。布局和管理子视图。 布局&#xff1a; 设置自身大小&#xff08;size&…

[附源码]Python计算机毕业设计SSM基于农产品交易系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

动态代理:JDK动态代理源码学习

文章目录前言概述什么是代理静态代理动态代理正文入口方法1&#xff1a;newProxyInstance方法2&#xff1a;getProxyClass0方法3&#xff1a;get 获取代理方法4&#xff1a;apply 创建代理方法5&#xff1a;generateProxyClass方法6&#xff1a;generateClassFile代理类总结前言…

LeetCode_动态规划_困难_1691.堆叠长方体的最大高度

目录1.题目2.思路3.代码实现&#xff08;Java&#xff09;1.题目 给你 n 个长方体 cuboids &#xff0c;其中第 i 个长方体的长宽高表示为 cuboids[i] [widthi, lengthi, heighti]&#xff08;下标从 0 开始&#xff09;。请你从 cuboids 选出一个子集 &#xff0c;并将它们堆…

ubuntu14.04搭建openGrok 1.7.40 + Java17+tomcat10.0.27阅读android系统代码

为了快速阅读android系统代码&#xff0c;首选openGrok&#xff0c;其它SI或understand估计不适合了。 话不多说&#xff0c;工欲善其事必先利其器&#xff0c;先下载源码和工具. 以下命令默认使用root&#xff0c;防止权限问题 一、下载android 代码 还是清华的镜像比较牛…

农村金融专题-保险支出、收入、补贴各省份涉农贷款数据集

一、31省市农业保险赔付支出 1、数据来源&#xff1a;wind数据库 2、时间跨度&#xff1a;2005-2019年 3、区域范围&#xff1a;全国 4、指标说明&#xff1a; 部分数据如下&#xff1a; 二、各省农业保险保费收入 1、数据来源&#xff1a; 中国保险数据 2、时间跨度&…

「杂谈·II」cmp() 的参数类型应该是啥?

0. 引言 上了一节 DS 课&#xff0c;但是回到了初学 C 的内容…… 众所周知&#xff0c;最小生成树的 Kruskal 要用边表排序&#xff0c;通常是 sort() 配 cmp()。 而 cmp() 的两个参数的类型最好是什么呢&#xff1f; 让我们回到初学 C 的时候&#xff0c;温习一下知识…… 1…

MySQL数据库学习(3)

MySQL中select语句语法简单介绍&#xff1a; 基本语法规则&#xff1a; SELECT {* | <字段列名>} [FROM <表 1>, <表 2>… [WHERE <表达式> [GROUP BY <group by definition> [HAVING <expression> [{<operator> <expression>…