面向对象程序三大特性:封装、继承、多态。而类和对象阶段,主要研究的就是封装特性。何为封装呢?就由小编来带大家梳理一下吧👊
目录
一、封装的概念
比如:对于电脑这样一个复杂的设备,提供给用户的就只是:开关机、通过键盘输入,显示器,USB插孔等,让用 户来和计算机进行交互,完成日常事务。但实际上:电脑真正工作的却是CPU、显卡、内存等一些硬件元件。
对于计算机使用者而言,不用关心内部核心部件,比如主板上线路是如何布局的,CPU内部是如何设计的等,用户 只需要知道,怎么开机、怎么通过键盘和鼠标与计算机进行交互即可。因此计算机厂商在出厂时,在外部套上壳 子,将内部实现细节隐藏起来,仅仅对外提供开关机、鼠标以及键盘插孔等,让用户可以与计算机进行交互即可。
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行 交互
二、封装的实现
1、实现方法
像这样就是通过private把成员变量name给封装了起来,这时就无法在类Student外调用name变量了,而这样又该如何使用这个成员变量呢?可以通过构建相应的方法:
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
这样就能通过公有的getName方法获取name的值,通关setName方法设置name的值。像这样使用封装后,对于外部代码来说,只需要关注Student类的公有方法,而不需要了解其内部实现细节。这样可以提高代码的可读性和可维护性,并且可以防止外部代码直接修改对象的状态。
2、访问限定符
上文提到的private就是java的访问限定符之一,Java中主要通过类和访问权限来实现封装:
类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认 知,而访问权限用来控制方法或者字段能否直接在类外使用
Java中提供了四种访问限定符:
说明:
- protected主要是用在继承中,继承部分详细介绍
- default权限指:什么都不写时的默认权限
- 访问权限除了可以限定类中成员的可见性,也可以控制类的可见性
- 一般情况下成员变量设置为private,成员方法设置为public
三、包
那么上文中提到的包是什么呢?接着往下看
1、什么是包
在面向对象体系中,提出了一个软件包的概念,即:
为了更好的管理类,把多个类收集在一起成为一组,称为软件 包。
简单来说,包其实就是一个文件夹。比如假设你的U盘有更多歌曲要进行分类,那么你怎么去进行分类?肯定是创建文件夹去分类:
在Java中也引入了包,包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式。
换句话说,现在你有很多java文件,那么你该怎么去划分这些文件?肯定会分类划分,具体操作是不是就是建立各种分类的文件夹
注意:
- 1、包名:全是小写
- 2、包还有一个重要的作用:在同一个工程中允许存在相同名称的类,只要处在不同的包中即可。
2、包中类的导入
Java 中已经提供了很多现成的类供我们使用. 例如Date类:可以使用 java.util.Date 导入 java.util 这个包中的 Date 类:
public class Test {
public static void main(String[] args) {
java.util.Date date = new java.util.Date();
// 得到一个毫秒级别的时间戳
System.out.println(date.getTime());
}
}
但是这种写法比较麻烦一些, 可以使用 import语句导入包:
import java.util.Date;
public class Test {
public static void main(String[] args) {
Date date = new Date();
// 得到一个毫秒级别的时间戳
System.out.println(date.getTime());
}
}
如果需要使用 java.util 中的其他类, 可以使用 import java.util.*,这样就可以直接使用java.util中的所有类。
注意:不建议总这样笼统地导包,容易出现冲突的情况,最好显式的指定要导入的类名
不然容易出现如下情况:
import java.util.*;
import java.sql.*;
public class Test {
public static void main(String[] args) {
// util 和 sql 中都存在一个 Date 这样的类, 此时就会出现歧义, 编译出错
Date date = new Date();
System.out.println(date.getTime());
}
}
// 编译出错
Error:(5, 9) java: 对Date的引用不明确
java.sql 中的类 java.sql.Date 和 java.util 中的类 java.util.Date 都匹配
因为上文中提到过包的一个重要作用:在同一个工程中允许存在相同名称的类,只要处在不同的包中即可,导入的两个包中出现了相同的名字,调用时就会产生歧义,导致编译报错
可以使用import static导入包中静态的方法和字段:
import static java.lang.Math.*;
public class Test {
public static void main(String[] args) {
double x = 30;
double y = 40;
// 静态导入的方式写起来更方便一些.
// double result = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
double result = sqrt(pow(x, 2) + pow(y, 2));
System.out.println(result);
}
}
注意:
import 和 C++ 的 #include 差别很大. C++ 必须 #include 来引入其他文件内容, 但是 Java 不需要. import 只是为了写代码的时候更方便. import 更类似于 C++ 的 namespace 和 using
3、自定义包
注意:
- 在文件的最上方加上一个 package 语句指定该代码在哪个包中.
- 包名需要尽量指定成唯一的名字, 通常会用公司的域名的颠倒形式(例如 com.baidu.www).
- 包名要和代码路径相匹配. 例如创建com.baidu.www的包, 那么会存在一个对应的路径com/baidu/www来存储代码.
- 如果一个类没有 package 语句, 则该类被放到一个默认包中.
步骤:
1. 在 IDEA 中先新建一个包: 右键 src -> 新建 -> 包
2. 在弹出的对话框中输入包名, 例如:com.baidu.www
3. 在包中创建类, 右键包名 -> 新建 -> 类, 然后输入类名即可
4. 此时可以看到我们的磁盘上的目录结构已经被 IDEA 自动创建出来了
5. 同时我们也看到了, 在新创建的 Test.java 文件的最上方, 就出现了一个 package 语句
注意:有些人创建的包会是下面这样连在一起的
是因为勾选了下面的选项导致的
单击一下取消勾选即可。
4、包访问权限
前文提到的访问限定符private和默认与protected和public的一大区别就是包访问权限不同,就是指被private和默认的修饰下的类,跨包后就无法调用了
常见的包:
- 1. java.lang:系统常用基础类(String、Object),此包从JDK1.1后自动导入。
- 2. java.lang.reflect:java 反射编程包;
- 3. java.net:进行网络编程开发包。
- 4. java.sql:进行数据库开发的支持包。
- 5. java.util:是java提供的工具程序包。(集合类等) 非常重要
- 6. java.io:I/O编程开发包。
总结
那么本篇文章就到此为止了,如果觉得这篇文章对你有帮助的话,可以点一下关注和点赞来支持作者哦。作者还是一个萌新,如果有什么讲的不对的地方欢迎在评论区指出,希望能够和你们一起进步✊