目录
- 1、面向对象的基本概述
- 2、三大基本特征之【封装】
- 3、对象授权的方式—访问控制符
- 4、实践看封装
1、面向对象的基本概述
JAVA是一门面向对象的高级编程语言,在JAVA语言中,除8个基本数据类型值以外一切都是对象,对象是JAVA程序的核心。
在JAVA程序中任意一个对象都可以都说成是一个类,类是JAVA程序的基本组成单位,所有的JAVA程序都可以说是由一个个类组成的。 JAVA作为一个面向对象的编程语言,完全支持面向对象的三大基本特征:【封装】、【继承】、【多态】。
2、三大基本特征之【封装】
JAVA的基本组成单位是类,因此封装也是基于面向类对象进行操作的,封装这两个字从字面意思上不难理解,就是将对象的信息隐藏在对象的内部,实现对对象信息的隐藏和保护,其它对象或者外部程序想要操作或者访问该对象内的信息,只能通过该对象所"授权"的方法来对该对象进行访问或者操作。
因此封装有两个方面的含义:
- 就是把该隐藏的隐藏——实现对对象内部信息的隐藏和保护。
- 把该暴露的暴露——实现与其它对象和外部程序的交互。
作为面向对象的三大基本特征之一,封装也有着自己的优点:
- 隐藏对象内部信息和实现细节,提高了代码的安全性。
- 可以保证对象的完整性,实现对对象更精确的操作。
- “高内聚”:封装对象详细信息, 从而便于修改对象的信息,提高对象的可维护性。
- “低耦合”:良好的封装可以将一个个对象封装一个个独立而又完整的个体,便于修改和扩展,从而降低耦合。
3、对象授权的方式—访问控制符
JAVA访问控制符共有4个,分别为private,default,protected和public,其访问控制级由小到大分别为:
访问控制符所控制的范围如下:
- private:只能被被当前对象(类)所访问。
- default:能被当前包下的其它对象(类)访问。
- protected:能被当前包下的其它对象(类)访问,也能被不同包下的子类所访问。
- public:可以被任意对象访问。
4、实践看封装
首先看下面一个Girl类:
/**
* 性别、年龄、姓名是一个女孩的属性
* Girl类对她的属性进行了封装
*/
public class Girl {
/**
* 性别
*/
private String gender;
/**
* 年龄
*/
private int age;
/**
* 姓名
*/
private String name;
/**
* 获取性别
*
* @return 返回性别结果
*/
public String getGender() {
return "女";
}
/**
* 获取年龄
*
* @return 返回年龄结果
*/
public String getName() {
if (this.age < 18) {
return "小可耐";
} else if (this.age > 18 && this.age < 30) {
return "真名";
} else {
return "假名";
}
}
/**
* 设置年龄
*
* @param age 年龄
*/
public void setAge(int age) {
if (age == 18) {
this.age = age;
} else {
System.out.println("只接受18岁!");
}
}
}
本文前面提到了,封装有两个方面的含义,就是将该隐藏的信息隐藏起来,将该暴露的暴露出去:对于Girl这个对象,她将自己的性别、年龄、姓名这些属性进行隐藏,实现了对自己信息的保护。但是这个对象也需要和对象进行交互,因此也需要暴露出一些自己的属性,让其他对象对其有一定的了解,因此Girl这个对象通过getGender()方法、getName()方法和setAge()方法将自己的性别属性、姓名属性和年龄暴露出来了。
下面通过Girl这个对象看一下封装的优点。
- 隐藏对象内部信息和实现细节,提高了代码的安全性。以getGender()方法为例,其它对象看不到这个方法的具体实现,而且因为本身是Girl对象,所以对调用这个方法的对象只返回结果性别“女”,而且不允许其它对象修改Girl对象的gender属性,保证了gender属性的安全。这就是封装的强大,对于特定的属性,可以进行隐藏,且可以不允许其它对象对其操作以保证这个属性的安全。
- 可以保证对象的完整性,实现对对象更精确的操作。以setAge()方法为例。setAge个()方法可以让其他对象对age这个属性进行赋值,但是这个方法对年龄赋值进行了约束,只接受18岁,不允许赋值其它年龄,不然你赋值一个女孩500岁,那不成老妖怪了。所以封装可以实现对对象内部的某个属性进行更精确的操作。
- “高内聚和低耦合” 。
内聚性:又称块内联系。指模块的功能强度的度量,即一个模块内部各个元素彼此结合的紧密程度的度量。若一个模块内各元素(语名之间、程序段之间)联系的越紧密,则它的内聚性就越高。反之内聚性越低。
耦合性:也称块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。反之则耦合性越低,独立性越好。
以getName()方法为例,通过封装的手段,让getName()方法根据Girl对象的age属性的大小返回相应的名称,因此封装可以实现高内聚。
假设Girl这个对象与其他对象相互独立,在Girl对象内部,通过封装的方法,新增某一个私有属性,比如boyFriend这个属性,那么这个属性也不会对其它调用Girl对象的其它对象造成影响。所以封装可以实现低耦合。
最后看一下Girl这个类用到的访问控制符:priave和public。
对于Girl对象的成员的私有属性(gender、age、name)都是private访问控制符进行修饰的,因此只有在Girl这个对象内部才可以对这些成员变量进行访问。
对于暴露出去的getGender()方法、getName()方法和setAge()方法都是通过public访问控制符进行修饰的,这代表着其它任一对象都可以通过Gilr对象对这些方法进行操作。