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

Java三大特性之一—— 封装

文章目录

  • 一、什么是封装
  • 二、访问修饰限定符
    • 2.1、public
    • 2.2、protected
    • 2.3、default
    • 2.4、private
  • 三、包
    • 3.1、什么是包
    • 3.2、导入其他包中的类
    • 3.3、自定义包
    • 3.4、包访问权限

一、什么是封装

    我们知道在面向对象编程的世界里有三大特征,分别是封装,继承,多态,那我们来了解了解何为封装。

    举个例子,拿我们的手机来说,我们所看到的手机外观基本都是非常漂亮的,我们只知道手机该怎么用手机有什么功能,但我们并不知道这些功能这小小的手机是怎么做到的那么小的体积做到有这么多的功能,我们身为使用者,我们是无法知道手机内部是怎么实现这么多功能的,这同时也是手机的制作者想要的,在手机制作者的世界里面,他认为使用者只需要会使用自己放出的功能就足够了,手机内部功能的实现是怎么做到的,使用者没必要知道,使用者会玩手机就足够了。

    这其中就体现了封装,使用者只能使用制作者放出来的东西,使用者不知道手机的内部功能的实现,我想要你知道的你才能知道,我不想要你知道的你就不能知道。封装指的是将数据和操作数据的方法有机结合,同时对外隐藏内部的细节,只暴露必要的接口供其他对象使用。封装性的主要目的是保护数据,防止外部的不合理访问和修改,从而提高代码的可维护性和可复用性。

二、访问修饰限定符

    那如何实现封装呢,这儿就需要使用到访问修饰限定符:public、private、protected、default。通过访问权限的不同来控制方法或者属性能否可以直接在类外使用

2.1、public

    public是Java里权限最大的,当前类,同一个包中的其他类,不同包的子类,不同包的非子类,都可以访问。可以理解外一个人的外貌,每个人都可以看得见。

2.2、protected

    protected是访问权限里面第二大的,通常用于被继承的父类,当前类,同一个包中的其他类,不同包的子类。

2.3、default

    default并不是一个关键字,当类内的方法或者属性没有被任何访问修饰限定符修饰时,当前方法或者属性被称为包访问权限。可以想象为一个家庭或者一个家族,包访问权限就相当与只有该家庭或者家族内部的人才知道的事情,家庭外或者家族外的人不知道这件事情

2.4、private

    private是所有权限中最小的,相当于某件事情只有自己知道,其他任何人都不知道。也被称之为私有权限

    大多数情况下,成员属性设置为private,成员方法设置为public,将对象的属性隐藏起来,提供开放的接口供给外部使用,这些接口可以操作成员属性。可以操作成员属性的方法一般有两种,一种是set方法,一种是get方法

public class Test1 {
    private int age;//私有
    private String name;//私有

    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;
    }
}

    set方法可以对成员属性进行赋值
    get方法可以取到成员属性的值

当成员属性数量多的时候,一个一个的定义set,get方法就会很繁琐并且消耗大量时间,此时编译器就提供了相应的快捷方式,可以一键生成set,get方法

在这里插入图片描述

    在其他类实例化该对象,观察private和public关键字的实现效果

在这里插入图片描述

    因为成员变量age,name被访问修饰限定符private修饰,在其他类是无法访问到该变量的,如果强制访问成员变量,则无法编译通过。

在这里插入图片描述

    此时只能通过set,age方法来对成员属性进行操作

在这里插入图片描述

三、包

3.1、什么是包

    在面向对象体系中,提出了软件包的概念,即为了更好的管理类,创建一个包把多个类收集在一起,称之为软件包。有点类似于文件夹,文件夹里面可以存储多个内容,将内容类似的存储在同一个文件夹中,比如说一个班级有男生和女生,男生的信息存储到一号文件夹,女生的信息存储到二号文件夹,此时学生的信息可以更好的进行管理
    包是对类和接口等的封装机制的体现 ,是类或者接口的容器,它通过命名空间来区分不同的类,使得即使类名相同,只要它们位于不同的包中就不会发生冲突。这也就意味着在同一个工程里面可以存在名字相同的类

3.2、导入其他包中的类

    Java本身提供了很多现成的类供我们使用,但在使用之前必须要进行导包,导包需要使用到import关键字,但大多数时候并不需要我们手动导包,编译器会自动导包

在这里插入图片描述

    输入Sc,编译器会弹出一个对话框,Scanner是Java.util包底下的类,用于读取控制台输入的内容,此时我们单击回车,编译器就会自动将util这个包底下的Scanner类导入当前类

在这里插入图片描述

    当我们在当前类里面同时用到同一个包里面的不同类时,在导包我们可以进行优化

import java.util.*;

    导包导包,顾名思义就是将包内我们所需要的类导入当前类中,import java.util.*,并非是将util包内的全部类导入当前类,而是代码需要调用哪个类,编译器就加载对应的util底下的类出来供给JVM使用。
    但是这种方式也是有缺陷的,首先就是代码的可读性降低了,其次就是有可能会导致冲突出现。

在这里插入图片描述

    util和spl两个包底下都定义有Data类,但此时两个包都进行导入了,编译器就不知道该使用那个包底下的类,出现歧义,这个时候就只能在代码里面指定使用哪个包底下都Data类了

在这里插入图片描述

        java.sql.Data data1 = new java.sql.Data(1);
        java.util.Data data2 = new java.util.Data();

3.3、自定义包

    1、在文件的最上方加上一个package语句声明当前类在哪个包中
    2、包名通常会使用公司的域名的颠倒形式(例如:com.bit.www),并且必须要小写字母
    3、包名和代码路径相匹配,例如创建com.bit.demo1的包,那么会存在一个对应的路径com/bit/demo1来存储代码
    4、如果一个类没有package语句,那么当前类是存放在默认包底下的,src是默认包。
    5、程序在运行的时候是默认在src这个包里面查找可执行程序的。

创建包
在这里插入图片描述
输入包名
在这里插入图片描述

在这里插入图片描述

创建包成功,新建类和之前的方法一样,右键单击报名,单击哪个包就是在哪个包底下新建类

在这里插入图片描述
在这里插入图片描述

    此时我们查看路径,出现了com/bit/demo1的路径,并且demo1包底下还有我们刚刚创建的Test类。

在这里插入图片描述

3.4、包访问权限

在这里插入图片描述

    Test类位于包demo1底下,Date类位于包src底下
仅有被public修饰的成员属性才能够被不同包底下的类进行访问,此时想要访问被private修饰和默认包访问权限的成员变量,只能构建set和get方法。


http://www.kler.cn/news/368189.html

相关文章:

  • 如何在vscode中使用鼠标滑轮滚动来改变字体大小
  • Pyspark中pyspark.sql.functions常用方法(4)
  • <Tauri>tauri2.0框架下,基于qwik(前端)和rust(后端)结合的桌面程序体验
  • 【Python】深入理解Python的列表推导式与生成器表达式:简洁与性能的权衡
  • 用更多的钱买电脑而不是手机
  • crc, md5 和 sha的区别
  • 【力扣】[Java版] 刷题笔记-94.二叉树的中序遍历
  • 四期书生大模型实战营(【入门岛】- 第4关 | 玩转HF/魔搭/魔乐社区)
  • Sql执行较慢的排查方式
  • 带你用Go实现二维码小游戏(上)
  • 10.23Python_Matplotlib_‘backend_interagg‘ has no attribute
  • smartctl硬盘检查工具
  • docker入门(三)自定义部署docker镜
  • Vuetify3响应式布局
  • c#时间对象(时间间隔)相关计算
  • 【已解决】edge浏览器会保存历史验证码?新版Edge如何关闭自动填充表单功能?
  • JMeter实战之——模拟登录
  • js实现数据版购物车(实现购物车所有功能)
  • CSS基础—网页布局(重点!)
  • JavaWeb合集18-接口管理Swager
  • YOLOv5/v8/v10/v11详细介绍:网络结构,创新点
  • 升级Unity后产生的Objects内存泄露现象
  • 面试总结(2024/10/16)
  • ubuntu 硬盘扩容
  • python对文件的读写操作
  • 快速入门HTML