【Java SE】封装

🥰🥰🥰来都来了,不妨点个关注叭!
👉博客主页:欢迎各位大佬!👈

在这里插入图片描述

文章目录

  • 1. 封装
    • 1.1 封装是什么
    • 1.2 封装的意义
    • 1.3 访问修饰限定符
      • 1.3.1 在Java中如何实现封装
      • 1.3.2 各种访问修饰限定符
  • 2. 包
    • 2.1 包的概念
    • 2.2 常见的包
    • 2.3 导入包中的类
    • 2.4 自定义包
  • 3. 深度理解private访问权限修饰符
    • 3.1 使用原因
    • 3.2 使用方法

1. 封装

面向对象三大特性:封装、继承、多态
今天我们一起来看看封装这一特性,在类和对象中,主要研究的是封装特性。

1.1 封装是什么

比如,在生活中,我们经常会看电视,我们仅需将电视开机,用遥控器调到自己喜欢的频道,但是我们并不知道这些功能如何在电视机实现的,电视机只给我们提供接口,我们利用接口,按下电视机开关按钮或是调节遥控器与电视机交互,具体如何实现,我们无从知晓,这就是封装,将实现的细节隐藏起来。
封装把类的实现细节进行隐藏,对外只提供一些交互的接口,让数据和操作数据方法有机结合。
所以在生活中,需要我们多去观察,很多计算机的知识来源于生活,所以计算机也没有那么神秘啦~

1.2 封装的意义

封装有什么意义呢?
电视机的具体实现如果不进行封装,很容易损伤,造成功能无法实现的现象,同时,如果不将实现细节隐藏,很容易造成行业之间的恶性竞争,所以封装的意义重大。
因此,我们类比总结:
【Java封装的意义】在于提高程序的安全性、保护数据、隐藏代码的实现细节统一接口以及实现松耦合,从而提高系统的可维护性和可扩展性

1.3 访问修饰限定符

1.3.1 在Java中如何实现封装

主要是通过这两种方式进行封装:
【1.类】在Java中通过类把数据以及封装数据的方法结合在一起
【2.访问权限】访问权限是通过控制方法或者字段等能否在类外使用

1.3.2 各种访问修饰限定符

在Java中提供4种访问限定符
在这里插入图片描述
由上述表中可以清晰得出:
1)private 权限特别小,只能在当前类中使用
2)default 为默认权限。即什么都不写的话就是默认权限
3)protected 主要使用在继承中,因为涉及到子类
4)public则是“谁”都可以看到

2. 包

2.1 包的概念

在日常生活中,我们在使用电脑的时候,如果有太多个文件,我们就会创建一个文件夹,将这些文件放入文件夹中。
【概念】
在Java中包是将类、接口等封装起来,是一种对类或者接口等的很好的组织方式。
【意义】
1)可以更好管理类、接口,把类、接口收集为一组,方便类、接口的查找和使用
2)可以避免类名相同造成的冲突,即在同一工程中,处在不同的包内,允许存在相同名称的类
3)可以限定访问权限,拥有包访问权限的类才能访问某个包中的类
4)可以更好维护程序的结构

2.2 常见的包

1)java.lang:系统常用基础类(String、Object)【该包从JDK1.1后自动导入】
2)java.util:是java提供的工具程序包(集合类等) 【常用且非常重要】
3)java.lang.reflect:java反射编程包
4)java.net:进行网络编程开发包
5)java.sql:进行数据库开发的支持包 6)java.io:I/O编程开发包

2.3 导入包中的类

在Java中提供了非常多现成的类供我们使用,导入一个包的其中一个类,则我们可以直接使用类。
举一个栗子吧~比如要求当前的日期与时间毫秒数值
java.util 包中提供 Date 类来封装当前的日期和时间,使用 getTime() 方法获取当前日期到1970年1月1日经历的毫秒数值。
有两种方法:
1)直接在new对象写
使用格式:

java.util.类名 对象名 = new java.util.类名();

具体代码:

public class Solution {public static void main(String[] args) {java.util.Date date = new java.util.Date();// 得到一个毫秒级别的时间戳System.out.println(date.getTime());}
}

2)使用import语句

使用格式:

import java.util.类名;

具体代码:

import java.util.Date;
public class Solution {public static void main(String[] args) {Date date = new java.util.Date();// 得到一个毫秒级别的时间戳System.out.println(date.getTime());}
}

通过比较,我们发现,第一种写法较为麻烦,如果要new多个该对象,则java.util会重复写,显得较为冗余,一般,我们都使用ipmort语句导入包中的类。
【注意】
如果要导入java.util其它的多个类,可以直接使用

import.java.util.*;

这个并不是把所有的类都导入了,是要用哪个,则会有,即随用随取
但是一般最好还是写出具体的类名,多写几个import语句
如果导入多个包,而使用的类在这些包里都有,则编译器不知道使用的是哪一个包中类,则容易造成冲突

import java.util.Date;
import java.sql.Date;
public class Solution {public static void main(String[] args) {Date date = new java.util.Date();// 得到一个毫秒级别的时间戳System.out.println(date.getTime());}
}

将会出现编译出错:
在这里插入图片描述
原因: java.util 中的类 java.util.Date和java.sql 中的类 java.sql.Date 都匹配,对Date引用不明确
在这种情况下,我们必须写出使用的完整类名,避免冲突

2.4 自定义包

指定包:在文件的最上方加上一个 package 语句指定该代码在哪个包中
如果一个类没有 package 语句, 则该类被放到一个默认包中(一般都直接放在默认包中,学会使用自定义导入包)

package com.wan.test1;

【包名注意事项】
1)包名需要尽量指定成唯一的名字,通常会用公司的域名的颠倒形式(如 com.wan.test1 ).
2)包名要和代码路径相匹配,例如创建 com.wan.test1 的包, 那么会存在一个对应的路径 com/wan/test1 来存储
代码
具体操作步骤:

1.点击src右键->新建(即点击New)->导入包(即点击Package)
2.输入包名:com.wan.test1(包名注意规则)
3.点击该包,在该包内创建类
4.磁盘中目录结构已经被自动创建出来(同时在新创建的 Test.java 文件的上方, 就出现package 语句,即代表在这个包下)

在这里插入图片描述
在这里插入图片描述
【包的权限注意】
在上面了解到各修饰符的范围,比如现在在这个package com.wan.test1中有Student类
在package.com.wan.test2中有StudentTest类导入package com.wan.test1的Student类

public class Student {private int sno;//学号private int score;//分数public String name;//姓名String sex;//性别public Student(int sno,int score,String name,String sex) {this.sno = sno;this.score = score;this.name = name;this.sex = sex;}
}
package com.wan.test2;
import com.wan.test1.Student;public class StudentTest {public static void main(String[] args) {Student sc = new Student(2022111,99,"张三","女");}
}

为什么会报错呢~
1.sno、score是被private修饰,私有的不能被其它类访问
2.sex未加修饰符,即是default修饰,不能被其它包内的类访问
3.Student类前必须有public,不然无法在 com.wan.test2包内使用

3. 深度理解private访问权限修饰符

3.1 使用原因

为什么需要使用private访问权限修饰符
1)private可以修饰成员方法、成员变量,被修饰的成员方法/变量只能在当前类使用
2)由上述知识,不难理解,在很多时候,我们需要封装以此提高安全性,可以隐藏类的实现细节,只提供对外开放的接口,实现对象之间的交互,而private通过访问权限,控制方法/字段不能在类外使用,体现封装的思想。

public class Student {private int sno;//学号String sex;//性别private int score;//分数public String name;//姓名public Student(int sno,int score,String name,String sex) {this.sno = sno;this.score = score;this.name = name;this.sex = sex;}private void attendClass() {System.out.println("上课啦!");}
}
class Test {public static void main(String[] args) {Student s1 = new Student(1,45,"张三","男");System.out.println(s1.sno);System.out.println(s1.score);System.out.println(s1.name);System.out.println(s1.sex);s1.attendClass();}
}

上述代码将会报错,由于学号,分数,方法attendClass()均被private修饰,在Test类不能进行访问。在生活中,我们需要将学号、分数这种隐私的信息隐藏起来。

3.2 使用方法

我们知道被private修饰的只能在当前类使用,如何让其它类使用到private修饰的成员变量呢?
1)得到private修饰的成员变量
方法:构造方法getSno()、getScore(),直接返回该值【即提供对外的接口来访问】
【注意】这些get方法需要用public修饰,如果仍然用private修饰则访问不到

public class Student {private int sno = 123;//学号String sex;//性别private int score = 11;//分数public String name;//姓名public int getSno() {return sno;}public int getScore() {return score;}}class Test {public static void main(String[] args) {Student student1  = new Student();System.out.println(student1.getSno());System.out.println(student1.getScore());}
}

2)对private修饰的成员变量赋值

public class Student {private int sno = 123;//学号String sex;//性别private int score = 11;//分数public String name;//姓名public int getSno() {return sno;}public int getScore() {return score;}public void setSno(int sno) {this.sno = sno;}public void setScore(int score) {this.score = score;}}class Test {public static void main(String[] args) {Student student1  = new Student();System.out.println("修改前:"+student1.getScore());student1.setScore(44);System.out.println("修改后:"+student1.getScore());}
}

结果如下,修改成功
在这里插入图片描述
【快捷方法】如果使用的集成开发环境为IDEA,可以快速创建Getter和Setter,编译器会自动生成上述get()和set()方法
【步骤如下】
1.右键点击Generate
2.选择Getter/Setter
在这里插入图片描述
本期内容回顾:
在这里插入图片描述
本期内容就到这里结束啦!继续加油呀~

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

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

相关文章

SpringCloud微服务集成Dubbo

1、Dubbo介绍 Apache Dubbo 是一款易用、高性能的 WEB 和 RPC 框架,同时为构建企业级微服务提供服务发现、流量治理、可观测、认证鉴权等能力、工具与最佳实践。用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服…

【二叉树】Leetcode 230. 二叉搜索树中第K小的元素【中等】

二叉搜索树中第K小的元素 给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。 示例1: 输入:root [3,1,4,null,2], k 1 输出:1 解…

在 fstab文件中配置 UUID方式自动挂载数据盘、swap、目录(**)

linux如何挂在硬盘,自动挂载和手动挂载(详细说明)https://gitcode.csdn.net/65eedcea1a836825ed7a06f4.html 解决linux重启后磁盘挂载失效的问题 https://blog.csdn.net/sugarbliss/article/details/107033034 linux /etc/fstab 文件详细说…

UG NX二次开发(C#)-通过曲线组生成NURBS曲面

文章目录 1、前言2、UG NX中通过曲线组生成NURBS曲面的操作3、采用NXOpen C#方法的源代码1、前言 在UG NX中,曲线、曲面的操作使用比较多,对于创建NURBS曲面,可以通过曲线组来生成,本文以NXOpen C#的方法实现通过曲线组生成NURBS曲面的功能。对于UG NX二次开发感兴趣或者有…

探索多种数据格式:JSON、YAML、XML、CSV等数据格式详解与比较

title: 探索多种数据格式:JSON、YAML、XML、CSV等数据格式详解与比较 date: 2024/3/28 17:34:03 updated: 2024/3/28 17:34:03 tags: 数据格式JSONYAMLXMLCSV数据交换格式比较 1. 数据格式介绍 数据格式是用于组织和存储数据的规范化结构,不同的数据格…

【aws】架构图工具推荐

碎碎念 以前以为日本冰箱论是个梗,结果居然是真的。用光盘传真其实还能理解(毕竟我也喜欢电子古董2333),但是画架构图居然用的是excel+截图!啊苍天呐,然后看到隔壁工位用excel画web原型又感觉释…

将数字城市复制到虚拟空间,如何搭建实景三维虚拟场景?

什么是实景三维? 实景三维(3D Real Scene)是一个专业术语,它指的是对一定范围内人类生产、生活和生态空间进行真实、立体、时序化反映和表达的数字虚拟空间。它是新型基础测绘的标准化产品,也是国家重要的新型基础设施…

权限提升-系统权限提升篇数据库提权PostsqlRedis第三方软件提权密码凭据钓鱼文件

知识点 1、数据库到Linux-数据库提权-Redis 3、数据库到Linux-数据库提权-PostgreSQL 4、计算机用户到系统-第三方软件-各类应用 章节点: 1、Web权限提升及转移 2、系统权限提升及转移 3、宿主权限提升及转移 4、域控权限提升及转移 Windows提权: 1、…

Linux 基于HAProxy+KeepAlived实现

Linux 基于HAProxyKeepAlived实现 1. 介绍1.1 高可用(HA-High Avaialbility)1.2 负载均衡(LB-Load Balance)1.3 HAProxy1.4 KeepAlived 2. 后端服务为Nginx2.1 系统拓扑2.2 环境说明2.3 前提条件2.4 详细步骤2.4.1 机器初始化2.4.…

Python列表、元组、字典及集合

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、列表定义方式: 二、元组1、定义方式:2、元组中的物理存储地址不可修改,如果修改则会报错,但是元组中的列表、字典项等却可以…

React-1-jsx基础-事件绑定-样式处理

一.JSX基础-概念和本质 1.1 什么是JSX JSX是JavaScript和XML(HTML)的缩写,表示在JS代码中编写HTML模版结构,它是React中编写UI模版的方式 优势: 1. HTML的声明式模版写法 2. JS的可编程能力 JSX的本质: JSX并不是标…

vivado 手动布线

手动路由 手动路由允许您为网络选择特定的路由资源。这给了你对信号将要采用的路由路径的完全控制。手动路由不调用route_design。路线在路线数据库中直接更新。当您想精确控制网络的延迟时,可能需要使用手动路由。对于例如,假设有一个源同步接口&#…

如何查看JVM使用的是什么垃圾收集器

文章目录 一、背景分析二、查看垃圾收集器三、理解的偏差四、深挖 demo 代码五、总结 一、背景分析 无论讨论对象的内存分配,还是讨论内存的回收策略或是算法,都需要明确指出是基于哪种垃圾收集器进行的讨论。所以,很自然地就想到这个问题&a…

脱敏技术!!!

什么是数据脱敏??? 数据脱敏(Data Masking)是一种数据安全技术,旨在通过预先设定的规则和算法,对原始数据中包含的敏感信息进行变形处理,使得这些信息在非生产环境(例如…

考研数学|汤家凤1800基础部分要做完吗?

我教你一个方法,保证让你高质量的做完1800基础部分,而且还不用把所有题目都做了 我当然不是教你如何投机取巧,投机取巧是考不了高分的,我教你的都是我在实际考研过程中实际运用到的方法! 其实这个方法也是我在二战的时…

C#手术麻醉系统源码 可对接HIS LIS PACS 医疗系统各类设备 医院手麻系统源码

C#手术麻醉系统源码 可对接HIS LIS PACS 医疗系统各类设备 手术麻醉信息管理系统主要还是为了手术室开发提供全面帮助的系统,其主要是由监护设备数据采集子系统和麻醉临床系统两个子部分组成。包括从手术申请到手术分配,再到术前访视、术中记录及术后…

面试题:Java虚拟机JVM的组成

1. 基础概念 JVM是什么 Java Virtual Machine Java程序的运行环境(java二进制字节码的运行环境) 好处: 一次编写,到处运行 自动内存管理,垃圾回收机制 JVM由哪些部分组成,运行流程是什么? …

C++从入门到精通——C++输入和输出

C输入和输出 前言一、C打印Hello World二、C输入&输出关于I/O流C输入&输出cout函数cin函数endl函数 三、C输入和输出的说明printf、scanf和cout、cin的区别cout函数和cin函数控制精度和宽度std命名空间的使用惯例 前言 C中的输入和输出主要通过标准库中的iostream类实…

Linux 入门及其基本指令(上)

目录 0 .引言 1. XShell 远程登录 Linux 1.1 云服务器 1.2. XShell 远程登陆 Linux 2. 详解 Linux 基本指令 2.1 ls 指令 2.2 pwd 指令 2.3 cd 指令 2.4 touch 指令 2.5 mkdir指令 2.6 rmdir指令 && rm 指令 0 .引言 如今,Linux 在服务器…

uniapp vue-cli项目配置devServer和outPutDir

上一次说了使用vue-cli创建uni-app项目,然后使用第三方工具开发打包,利用jekins发布等。 这一次我想解决以下问题: 1我想配置devServer供开发环境使用,这样也可以解决开发环境的跨域问题 2以前我的每个版本信息都配置在package…