目录
面向对象的三个特性:封装、继承、多态,本章对其封装性进行分析。
1、什么是封装?
封装,简单的理解就是将某一类对象的信息和操作进行一定的保护处理,避免其他类可以随意的不受限制的访问该类中的信息,同时隐藏底层实现的细节,只对外提供简单的操作入口,其他类通过该入口进行信息的获取和修改。
2、为什么封装?
以学生类为例:学生类中包含一个sno状态信息
public class Student {
int sno; //学号
}
主方法如下:
public class test04 {
public static void main(String[] args) {
Student stu=new Student();
stu.sno=-1234;
System.out.println(stu.sno);
}
}
运行结果:成员整形类型变量未被赋值之前,默认值为0
0
-1234
Process finished with exit code 0
后人为的对其进行赋值,但是从现实理论上讲,学号不可能为负数,这样的话,就造成了对数据信息的非法的访问,可以发现外部可以对Student类中的数据信息进行随意的访问和修改,这样的话,不能有效的保证数据信息的正确性和有效性。
为了避免这类问题,出现了封装的功能。
3、如何实现封装?
关键字:private
①首先将类中的状态信息私有化,即在定义变量时,修饰符列表为private进行修饰,表示私有的,(如果没有写明修饰符,那么默认是public)用该修饰符修饰的状态信息和动作信息都只隶属于当前类,只能在本类中进行访问。
②为私有的信息和方法提供简单的操作入口,使外部类能够通过规定的方式进行访问。对外提供两个公开的方法,因为对于数据信息的访问通常是读取和赋值两种,即分别对应的是Set和Get方法,为其他类提供访问入口。
4、访问入口如何定义?
如下代码所示:属性被设置为私有的,然后通过公有的方法进行访问
public class Student {
private int sno; //学号
private String sname; //姓名
public int getSno(){
return sno;
}
public void setSno(int sno){
this.sno=sno;
}
}
主方法:通过公有的方法,结合参数、返回值、赋值操作,完成私有属性的获取或者修改操作。
public class test04 {
public static void main(String[] args) {
Student stu=new Student();
System.out.println(stu.getSno());
stu.setSno(-1234);
System.out.println(stu.getSno());
}
}
输出结果:
0
-1234
Process finished with exit code 0
那么上述例子依旧是一个灵活得方法,还是该访问访问,该任意赋值任意赋值啊,但是注意get和set是方法,方法中可以通过编写一定的逻辑代码来进行限定约束,保证逻辑的正确性,这才是封装的最佳用法,封装并过滤。
在定义方法时,注意setXxx(参数)方法是设置值的,需要用户传进来一个值,借助参数去接收这个值,所以该方法需要设置参数,但是不需要返回值,因为无需接收数值。但是getXxx()方法就需要返回值,因为调用该方法的时候一般是获取某个值,所以需要借助返回值来获取该值,但是不需要参数列表,因为只对数据通过返回值的方式进行接收。
方法定义命名规范:操作名+属性名首字母大写(),两个方法没有static关键字,是常规得方法
复习:
没有static修饰符修饰的方法和属性都依赖于实例而存在,只能通过实例进行调用。
所以总的来说,其实封装就是私有的信息外部不能直接进行访问
5、封装有什么好处?
①隐藏了底层的实现细节,调用者只能通过固定的操作入口对信息进行访问,一定程度上简化了操作,例如:照相机,我们不需要明白其内部的实现细节,通过一定的按键操作即可以完成使用。
②只有封装了,才算真正的对象,算真正的“独立体”,否则如果可以任意进行访问,就不能称之为独立体,例如:人之所以称之为个体,正是因为人对于自身内心的封装,有所保留。
③ 如果足够的独立,那么代码的复用性就会提高,具有更强的适应性。
④保证了安全,保证信息的安全性和准确性,封装后,外部类无法直接的对信息进行访问,而是会受到编写者编写的一定的限制的约束。例如:电视机如果没有进行封盖处理,那么会很容易弄坏,如果进行了“封装”,一定程度上保证设备的安全性,这里也同理。
所以建议对类进行封装处理,保证内部数据信息的正确性和安全性,注意封装后,一定要对相关的数据的访问和获取提供相关的入口,因为通常这些信息都是具有一定作用的,对于这些信息的操作通常有两种(1、读取;2、赋值),如果封装后不提供一定的访问入口,就过于封闭了,这些数据可能会失去意义,所以我们要提供一些访问这些数据的方法,借助公有的方法去访问私有的信息,完成封装。