Java全面分析面向对象之封装
目录
- 什么是封装呢
- 封装的好处意义
- getter方法和setter方法
- toString方法
- 面向对象封装之包
- 自定义包
什么是封装呢
封装就是一种将数据和操作数据的方法进行有机结合,一种函数抽象类的接口实现了对细节的封装和隐藏,使得我们只需要调用对外开放的公共接口去实现与对象的交互。我们可以把封装理解为一种保护的屏障,需要一些严格的接口进行控制,我们可以修改自己实现类的内部结构的代码,但是不可以修改那些公共接口。这就提供更好的安全性。
封装的好处意义
- 好的封装能够减少耦合度
- 能够对成员变量更精准的控制
- 实现对细节的封装和隐藏,使得更具有安全性。
- 可以修改类的内部代码,不用修改那些公共的接口
讲到封装那必然讲到关键字private也就是访问修饰限定符。
回忆一下我们见过哪些访问修饰限定符呢?有public ,还有成员变量什么也不加的默认权限英文是default,还有就是我们今天要讲解的private,下一篇文章会讲解protected。
那private到底有什么用处呢?
我们在来回忆一下上篇文章讲过的类和对象,下面我会创建一个学生类。
//创建一个学生类 class Student { public String name;//学生姓名 public int age;//学生年龄 public String sex;//学生性别 public double score;//学生分数 public void sleep() { System.out.println("我要睡觉了!!!"); } public void eat() { System.out.println("我要干饭了!!!"); } public void exam() { System.out.println("我要考试了!!!"); } } public class TestDemo { public static void main(String[] args) { Student student = new Student();//利用new关键字实例化一个对象 student.age = 19; student.name = "厚积薄发"; student.score = 99.9; student.sex = "男"; } }
以上的代码我们将这个学生成员变量分别赋值。这样写会不会有什么不足呢?
想一想,如果我们每次要定义一个学生对象,每次都要这样赋值会不会有点太麻烦?今天我们讲到封装就会让它更简单一些。请看下面代码:
class Student { private String name;//学生姓名 private int age;//学生年龄 private String sex;//学生性别 private double score;//学生分数 public String getName() { return name; } public void setName(String name) { this.name = name; } } public class TestDemo { public static void main(String[] args) { Student student = new Student(); student.setName("厚积薄发"); System.out.println(student.getName()); } }
根据封装的概念我是不是可以给它封装成一个公共的接口然后调用。
好接下来分析一下这个代码:
所以,我们在成员变量前面加上private修饰使得成员变量只能在类的内部访问,不能在类的外部访问,然后我们实现了setName getName方法,调用者两个接口就可以进行初始化和返回值操作,更好地体现了封装性。
getter方法和setter方法
为了更方便的调用这些接口,IDEA会为我们提供了这些接口,我们通常情况下把这些方法叫做getter方法和setter方法。只要我们需要我们就可以调用这些共有的getter方法和setter方法。
IDEA快捷键:Alt + insert
class Student { private String name;//学生姓名 private int age;//学生年龄 private String sex;//学生性别 private double score;//学生分数 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public double getScore() { return score; } public void setScore(double score) { this.score = score; } public void sleep() { System.out.println("我要睡觉了!!!"); } public void eat() { System.out.println("我要干饭了!!!"); } public void exam() { System.out.println("我要考试了!!!"); } } public class TestDemo { public static void main(String[] args) { Student student = new Student();//利用new关键字实例化一个对象 student.setName("厚积薄发"); student.setAge(19); student.setScore(99.9); student.setSex("male"); System.out.println(student.getName()); System.out.println(student.getAge()); System.out.println(student.getScore()); System.out.println(student.getSex()); } }
toString方法
此外,我们每个成员变量都要自己实现一遍打印操作,没错IDEA编译器又为我们提供了一个方法,这个方法叫做toString方法,快捷键是 Alt +insert然后选择toString方法。
我们直接打印对象的引用就可以调用toString方法.
有同学就会问为什么呢?
这就得需要我们看一看println的源码是怎么实现的了。
我们按住ctrl 点进println这个方法
我们通过源码就可以发现,println会调用toString方法,如果定义了toString方法,那他就调用toString方法,如果没有调用他就会打印:
eg:
其中IDEA还为我们提供了构造方法,为了更好地方便初始化,构造方法的文章请看这篇文章:
Java 类与对象超基础讲解
快捷键: Alt + insert 选择constructor
总结:
private关键字:利用private修饰的成员变量和方法只能在本类中访问,如果在外部访问可以调用公有的setter方法和getter方法。
封装的优点:减少代码的耦合性 , 可以自由修改自己的内部类,不用修改公有地接口 ,隐藏信息实现细节,更精准的控制成员变量。
要记住并且运用并且调用这些公共的接口:getter方法和setter方法 还有toString方法 以及 构造方法。
面向对象封装之包
包是什么呢?
包其实就是类似于文件夹,为了更好地管理。在java中引入包的概念,包的用处:如果一个包中的类不想被另外一个包中的类使用这就更好地体现了封装性,还有一个作用就是,Java中不可以在src底下创建相同的类名,这一点包就可以解决,只要在不同的包中,类的名称可以一样。
怎么进行导包呢?
还记得我们在学习数组的时候使用过Arrays这个类,我们就要导入java.util包
例如:
当然我们还可以手动导入
这里还需要注意一个问题:
我们可以注意到在包中有java.util包也有java.sql包,当我们同时导入这两个包,计算机就会反应不过来到底导入哪个包
所以,当同时导入util包和sql包时候,我们需要手动导入具体是导入那一个包。
自定义包
一般包的名字都是域名倒着过来 例如 com.hjbf.TestDemo
我们上面文章讲过访问修饰限定符,有一个是默认访问权限(default)其实也叫作包访问权限,如果成员变量前边什么也不加那就是默认访问权限也叫作包访问权限只能够在同一包中使用。
这里我们要注意一下我们创建一个包,他就会导入这个包,其中packge是声明在包中,后面的就是路径。
我们可不可以在这个包里访问其他包呢?
答案是可以的,当我们访问其他包时候,他就会在本包中导入其他的包。
包的基本规则:
- 在文件的最上方加上一个 package 语句指定该代码在哪个包中.
- 包名需要尽量指定成唯一的名字, 通常会用公司的域名的颠倒形式(例如 com.bit.demo1 ).
- 包名要和代码路径相匹配. 例如创建 com.bit.demo1 的包, 那么会存在一个对应的路径 com/bit/demo1 来存储代码.
- 如果一个类没有 package 语句, 则该类被放到一个默认包中.
常见的包分类:
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编程开发包
到此这篇关于Java全面分析面向对象之封装的文章就介绍到这了,更多相关Java封装内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!