共计 2497 个字符,预计需要花费 7 分钟才能阅读完成。
1、封装概述
1.1、什么是封装
成员变量都是隐藏在对象内部的,外界无法直接操作和修改。
封装可以被认为是一个保护屏障,防止该类的代码和数据被其他类随意访问。要访问该类的数据,必须通过指定的方式。适当的封装可以让代码更容易理解与维护,也加强了代码的安全性。
1.2、封装的原则
将属性隐藏起来,若需要访问某个属性,提供公共方法对其访问。
1.3、封装步骤
private 修饰成员变量
对需要访问的成员变量,提供对应的一对 get/set 方法
1.4、案例
** 需求:** 编写一个类中得到生日的方法
分析:
① 类的成员变量可以成为只读或者只写的。比如用:访问器 getXxxx(); 或者修改器 setXxxx();
② 类可以对储存在其中的成员变量中的内容有一个整体的控制。可以根据访问修饰符的提点在其它类中调用该类中的属性和行为。
③类的用户不需要知道类是如何储存数据的。
public String getBirthday(){return year + "-" + month + "-" + day; | |
} | |
public void setBirthday(String birthday){// 拆分字符串,分别取出年月日, 给 year、month、day 进行赋值 | |
} | |
而在外部调用这个方法的时候 | |
this.getBirthday(); | |
this.setBirthday("1990-9-9"); | |
此时就体现出外部是不知道如何储存 birthday 这个方法的,用户只能调用它。 |
2、封装实现
2.1、private 修饰属性
修改属性的可见性来限制对属性的访问(一般限制为 private)
public class Person{private String name; | |
private int age; | |
} |
这段代码中,将 name 和 age属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏。
2.2、公共方法访问
对每个值属性提供对外的公共方法访问,也就是创建一对赋值取值方法,用于对私有属性的访问。
public class Person{private String name; | |
private int age; | |
public int getAge(){return age; | |
} | |
public String getName(){return name; | |
} | |
public void setAge(int age){this.age = age; | |
} | |
public void setName(String name){this.name = name; | |
} | |
} |
我们将 name,age 属性私有化,那么除了 Person 这个类以外其他地方都不能使用他,所有这个时候,我们选择了全局的 set,get 方法,来为我们的属性 name,age 来存放值和取值。
采用 this 关键字是为了解决成员变量(private String name)和局部变量(setName(String name)中的 name 变量)之间发生的同名的冲突。
2.3、案例
public class Encap{private String name; | |
private String idNum; | |
private int age; | |
// 声明 set,get 方法初始化与获取 | |
public int getAge(){return age; | |
} | |
public String getName(){return name; | |
} | |
public String getIdNum(){return idNum; | |
} | |
public void setAge(int newAge){age = newAge;} | |
public void setName(String newName){name = newName;} | |
public void setIdNum(String newId){idNum = newId;} | |
} |
public class EncapDemo{public static void main(String args[]){Encap encap = new Encap(); | |
// 创建对象,通过对应的 set 方法,初始化 | |
encap.setName("James"); | |
encap.setAge(20); | |
encap.setIdNum("12343ms"); | |
System.out.print("Name :" + encap.getName()+ "Age :"+ encap.getAge()); | |
} | |
} |
运行结果:
我们在调用我们的属性 name,age 的时候,使用了,set,get 方法,那么这就是一个典型的封装。
3、javaBean
JavaBean 是 Java 语言编写类的一种标准规范。符合 JavaBean 的类,要求类必须是具体的和公共的,并且具有无参数的构造方法,提供用来操作成员变量的 set 和 get 方法。
3.1、格式
public class ClassName{// 成员变量 | |
// 构造方法 | |
// 无参构造方法【必须】每个类都有一个默认的无参的构造方法 | |
// 有参构造方法【建议】 | |
// 成员方法 | |
//getXxx() | |
//setXxx() | |
} |
3.2、案例
需求:编写一个 javaBean 规范的类,以动物类为例。
public class DongWu{private String name; | |
private int age; | |
// 构造方法, 默认可不写 | |
public DongWu(){ } | |
// 有参的构造方法 | |
public DongWu(String name,int age){this.name=name; | |
this.age=age; | |
} | |
// 成员方法 | |
public void setName(String name) {this.name = name; | |
} | |
public String getName() {return name; | |
} | |
public void setAge(int age) {this.age = age; | |
} | |
public int getAge() {return age; | |
} | |
} |
public class DongWuDemo {public static void main(String[] args) {// 无参构造使用 | |
DongWu s= new DongWu(); | |
s.setName("猫"); | |
s.setAge(2); | |
System.out.println(s.getName()+"‐‐‐"+s.getAge()); | |
} | |
} |
运行结果:
