前言
面向对象的三大特性是指:封装、继承、多态。这三大特性支撑了整个面向对象的理论体系,是面向对象的核心。注意不是只有Java有这三种特性,所有的面向对象的编程语言都有,例如C++等。这篇博客主要总结的是封装。
一、封装
1、什么是封装?
何为封装?简单来说就是套壳屏蔽细节。
比如:对于电脑这样一个复杂的设备,提供给我们用户的就只是:开关机键、通过键盘输入,显示器,USB插孔等,让用户来和计算机进行交互,完成日常事务。但实际上:电脑真正工作的却是CPU、显卡、内存等一些硬件元件。对于我们计算机使用者而言,一般不会太过于关心内部的核心部件,比如主板上线路是如何布局的,CPU内部是如何设计的等,我们只需要知道,怎么开机、怎么通过键盘和鼠标与计算机进行交互即可。因此计算机厂商在出厂时,就在外部套上一个外壳,将内部的细节隐藏起来,这就是我们所说的封装。
Java中的封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公布接口来和对象进行交互!
2、怎样实现封装?
我们了解了什么是封装,之后该如何去实现封装呢?在Java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知。而访问权限用来控制方法或者字段能否直接在类外使用。
(1)认识访问限定符
范围 | public | protected | default | private | |
---|---|---|---|---|---|
1 | 同一个包中的同一个类 | YES | YES | YES | YES |
2 | 同一个包中的不同类 | YES | YES | YES | |
3 | 不同包中的子类 | YES | YES | ||
4 | 不同包中的非子类 | YES |
注:default权限指:什么都不写时的默认权限。
理解:
public:就好比一个人的外貌,谁都可以看得到。default(什么都不写):对于自己家族中(同一个包中)不是什么秘密,对于其他人来说就是隐私了。private:只有自己知道,别人都不知道。protected:自己家族中(同一个包中)的人都知道,还有一个你比较好的朋友(不同包中的子类)也知道。(2)封装代码实现
访问权限符既可以控制类中成员的可见性,也可以控制类的可见性。即,类中的成员属性或者方法不想被别人调用,就可以在属性前面加上private关键字设置访问权限,同样,如果这个类我也不想被别人使用,只需在class前面加上private关键字设置访问权限就可以了。
例如:
public class Computer { private String cpu; //cpu private String memory; //内存 public String screen; //屏幕 String brand; //品牌--->default属性 public Computer() { } public Computer(String cpu, String memory, String screen, String brand) { this.cpu = cpu; this.memory = memory; this.screen = screen; this.brand = brand; } public void Boot(){ System.out.println("开机!!!"); } public void PowerOff(){ System.out.println("关机!!!"); } public void Surflnternet(){ System.out.println("上网!!!"); }}public class TestComputer { public static void main(String[] args) { Computer p = new Computer("i9","16G","13*14","HUAWEI"); System.out.println(p.brand); //default属性:只能被本包中的类访问 System.out.println(p.screen); //public属性:可以被任何类访问 //System.out.println(p.cpu); //private属性:只能在Computer类中访问,不能被其他类访问 }}
访问权限符控制类中成员的可见性。 访问权限符控制类控制类的可见性。
二、封装扩展之 --- 包
1、什么是包
在面向对象体系中,提出了一个软件包概念,即:为了更好的管理类,不把多个类收集在一起成为一组,称为软件包。
Java中引入了包,包是对类、接口等封装机制的体现,是一种对类或者接口的很好的组织方式。
这个包,有点类似于电脑中的文件目录。比如:为了更好的管理我们电脑中的一些小电影,一般是将相同属性的电影放在相同文件目录下进行分类,当然还可以对某个文件夹下的电影再继续进行更详细的分,如下类图所示。
注:在同一个工程中允许存在相同名称的类,只有处在不同的包中即可。
2、package 定义包
定义包主要是区分相同名称的类、能够较好地管理大量的类、控制访问范围。
Java 中使用 package 语句定义包,package 语句应该放在源文件的第一行,在每个源文件中只能有一个包定义语句,并且 package 语句适用于所有类型(类、接口、枚举和注释)的文件。
基本规则:
在文件的最上方加上一个package语句指定该代码在哪个包中。 包名需要尽量指定成唯一的名字,通常会用公司的域名的颠倒形式(com.csdn.blog)。包名要和代码路径相匹配,例如创建 com.csdn.blog 的包,那么会存在一个对应的路径 com/csdn/blog 来存储代码。 如果一个类没有package语句,则该类放在一个默认包中。
IDEA上创建包操作步骤:
在IEDA中先新建一个包:右键src -> New ->package2. 在弹出的对话框中输入包名
3. 然后就可以在包中创建类了。
3、import 导入包中的类
Java 引入了 import 关键字,import 可以向某个 Java 文件中导入指定包层次下的某个类或全部类。导入的类可以自己写的类,也可以是Java给我们提供的类。
import 语句位于 package 语句之后,类定义之前。一个 Java 源文件只能包含一个 package 语句,但可以包含多个 import 语句。
(1) 使用 import 语句导入单个类的语法:
import 包名 + 类名
import java.util.Arrays;
(2)使用 import 语句导入指定包下全部类的用法按如下:
import 包名 + *
import java.util.*;
上面 import 语句中的星号(*)只能代表类,不能代表包,表明导入 Java.util 包下的所有类。
提示:使用星号(*)可能会增加编译时间,特别是引入多个大包时,所以明确的导入你想要用到的类是一个好方法,需要注意的是使用星号对运行时间和类的大小没有影响。
特殊情况:比如Date类,它在java.util包下和java.sql包下都存在,如果你需要同时使用两个包下的不同的Date类,使用星号(*)就会出现冲突,idea会报错,因此一般推荐显示的指定要导入的类名。
(3)可以使用 import static 导入包中静态的方法和字段。
(4)通过使用 import 语句可以简化编程,但 import 语句并不是必需的,如果在类里使用其它类的全名,可以不使用 import 语句,无需导入import java.sql.Date。
java.sql.Date d = new java.sql.Date();
4、常见的包
java.lang:包含JAVA语言的核心类,如String、Math、System和Thread类等,这个包的类自从JDK.1后会被系统自动导入。java.util:包含了大量的工具类/接口和集合框架类/接口,例如Arrays和List、Set等。java.net:包含一些java网络编程相关的类/接口。java.io:包含java输入/输出编程相关的类/接口。java.text:包含一些java格式化相关的类。java.sql:包含了java进行JDBC数据库编程的相关类/接口。java.awt:包含抽象窗口工具集的相关类/接口,主要用于图形用户界面程序。java.swing:包含了swing图形用户界面编程的相关类/接口,用于构建平台无关的GUI程序。
结束
最后,因为博主现在并不是什么大牛,也会犯错!如有错误之处欢迎指正!感激不尽!
希望这篇博客对大家有所帮助,喜欢就请点个赞呗!