封装
所有的OOP语言都会有三个特征:
- 封装
- 继承
- 多态
本篇文章会为大家带来有关封装的知识。
在我们日常生活中可以看到电视就只有那么几个按键(开关,菜单……)和一些接口,而而我们通过这些东西就可以实现我们的需求,并不用深究它的构造。而它内部的一些构造(CPU,……)厂家都会用一个外壳来吧它们封装起来不让我们直接看到里面的东西。
OOP语言中的封装就是:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口和方法来和对象进行交互。
那么问题来了我们知道我们在类外可以使用‘.’操作符来访问它的内部属性,那它应该如何隐藏属性和实现细节呢?
在Java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知,而访问权限用来控制方法或者字段能否直接在类外使用。
范围 | private | 默认的 (什么都不写) |
protected | public |
同一包中的同一类 | 可以 | 可以 | 可以 | 可以 |
同一包中的不同类 | 可以 | 可以 | 可以 | |
不同包中的子类 | 可以 | 可以 | ||
不同包中的非子类 | 可以 |
- public:可以理解为一个人的外貌特征,谁都可以看得到;
- private:只有自己知道,其他人都不知道
此时我们就可以通过访问限定符来限制类中的成员不被外界所访问。
从表格中可以看出它们的范围都是包和类,那么类我们知道是什么,那包是个什么东西呢?暂时可以不用管文章后边有介绍。
在同一个包中:
此时你可以不用管包是什么,因为我们在学习阶段平时都是在同一个包中进行代码的编写。
此时我们可以看到虽然类当中有name属性可是由于它的权限是private所以当我们在类的外部进行访问时系统就会报错。而age的权限是默认的可以被同一个包中的不同类进行访问。
那么如果我们想对name进行修改应该怎么办?因为它被private所修饰只能被类中的成员所访问,所以此时我们就可以写一个修改name的方法或者也是最简单粗暴的方法直接将private进行修改。
classStudent{ privateStringname; intage; publicStringgetName() { returnname; } publicvoidsetName(Stringname) { this.name=name; } } publicclassMain { publicstaticvoidmain(String[] args) { Studenta=newStudent(); a.setName("zhangsan"); System.out.println(a.getName()); System.out.println(a.age); } }
包
包的概念:
为了更好的管理类,把多个类收集在一起成为一组,称为软件包。
注:在同一个工程中允许存在相同名称的类,只要处在不同的包中即可。
其实包你可以简单理解为文件夹。
在JAVA中你可以通过import语句导入包中的类。
没错我们平时再输入输出时在代码第一行写的和C语言头文件相似的语句其实就是在导入包中的类。比如:
import java.util.Scanner;
自定义包
自定义包的基本规则:
- 在文件的最上方加上一个 package 语句指定该代码在哪个包中;
- 包名需要尽量指定成唯一的名字, 通常会用公司的域名的颠倒形式(例如:com.baidu.www);
- 包名要和代码路径相匹配. 例如创建 com.baidu.www 的包, 那么会存在一个对应的路经com/baidu/www 来存储代码;
- 如果一个类没有 package 语句, 则该类被放到一个默认包中。
首先我们如何创建一个包:
在IDEA中创建包的过程如下,先右击src然后鼠标放在new然后点击package;
然后在你创建的包上右击创建一个类:
此时你就可以看见IDEA在该路径下创建了一个文件:
而此时我们可以看见创建的类上面多了一个语句
而我们之前是系统默认的包所以没有。
在不同包中:
此时因为两个类没有构成父子关系所以只有sex没有报错。
如下只有protected和public修饰的可以在不同包的子类中访问。