面向对象的三大特征:
- 封装
- 继承
- 多态
有了封装,才能继承,有了继承,才能说多态
定义
什么是封装?封装有什么好处?
是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个密不可分的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部细节,只保留一些对外接口使之与外部发生联系,系统的其他对象只能通过包裹在数据外面的已被授权的操作来与这个封装的对象进行交流和交互。
封装的作用有两个:
第一个作用:保证内部结构的安全
第二个作用:屏蔽复杂,暴露简单
怎么封装,代码怎么写?
- 属性私有化
- 1个属性对外提供两个set和get方法。对外程序只要通过set方法修改,只能通过get方法读取。可以通过在set方法中设立关卡来保证数据的安全性,
在强调一下:
set和get 方法都是实例方法,不能带static。
不带static的方法被称为实例方法,实例方法的调用必须先new对象。
set和get方法写的时候有严格的规范要求:(要按照规矩来)
set方法格式:
public void set+属性名首字母大写(1个参数){
xxx = 1个参数;
}
get方法格式:
public void get+属性名首字母大写(无参数){
return xxx;
}
尽量按照java规范中要求的格式提供set和get方法。
如果不按照这个规范格式来,那么你的程序将不是一个通用的程序。
代码
Person 表示人类:
- 每一个人都有年龄这样的属性。
- 年龄age,int 类型
不使用封装
我这里先不使用封装机制,分析程序存在什么缺点?
person 类的age属性对外暴露,可以在外部程序中随意访问,导致不安全。
//这个个没有封装的Person
public class Person{
int age;//age 属性是暴露的,在外部程序中可以随意的访问,导致了不安全。
}
尝试封装
不再对外暴露复杂的数据,封装起来
对外只提供简单的操作入口
优点:第一数据安全了。第二调用者方便了。
public class Person {
//private 表示私有的,被这个关键字修饰后,该数据只能在本类中访问。
//出了这个类,age属性就无法访问了,私有的。
private int age;//每个人的年龄值不同,对象级别的属性
//写一个方法专门用来完成读(get)
//写一个方法专门用来完成写(set)
//get方法和set方法应该被定义为实例方法
//get读年龄,set改年龄,这个读和改都是操作一个对象的年龄。(没有对象哪有年龄?)
//封装的第二步:对外提供公开的set方法和get方法作为操作的入口。并且不带static
// 【修饰符列表】 返回值类型 类名 方法名(形参){
//}
//get方法 是读的,需要返回值,不需要传参数;所以要有返回值的类型int ,形参为空
public int getAge(){
return age;
}
//set方法 是写入, 不需要返回值,但是要传入参数;所以 返回值类型为void,形参为int
public void setAge(int nianling){
// 能不能在这个位置设置关卡!!!
if(nianling<0 || nianling>120){
System.out.println("输出的年龄不合法,请重新赋值");
return; //直接终止程序的运行
}
//程序运行到这一步,年龄是合法的
age = nianling;
}
}
main程序
public class PersonTest{
public static void main(String[] args) {
//创建一个对象
Person p1 = new Person();
//读取年龄
System.out.println(p1.getAge());//0
//传入年龄
p1.setAge(23);
System.out.println(p1.getAge());//23
//
// //传入年龄 (非法)
p1.setAge(-100);
System.out.println(p1.getAge());//23
}
}