为什么要用封装
什么是封装
怎样实现封装
[@more@]
我们通一个案例来分析一下
(1) 阿柏泰克的员工具有属性:姓名、年龄。
(2) 阿柏泰克的员工具有行为:自我介绍
(3) 对阿柏泰克的员工有一个要求:24岁
通过我们前面学的过的内容,我们给出的代码如实例1所示。
实例1
package org.hopetech.l01;
public class Employee1 {
public String name; // 员工姓名
public int age; // 员工年龄
/**
* 员工进行自我介绍
*/
public void selfIntroduction() {
System.out.println("我是" + name + ",我今年有" + age + "岁了!");
}
}
示例1中的Employee1类具有两个属性“name”、“age”,一个方法“selfIntroduction”。我们编写一个测试类来测试一下它的属性是否符合我们的需求。
(1) 实例化一个员工对象,将其属性进行初始化。
(2) 调用该员工自我介绍的方法。
测试类的具体代码如实例2所示,其运行结果如图1.1所示
实例2
package org.hopetech.l01;
public class Employee1Test {
public static void main(String[] args) {
//实例化一个员工
Employee1 employee = new Employee1();
//设定员工的属性
employee.name = "李东";
employee.age = 16;
//调用员工自我介绍的方法
employee.selfIntroduction();
}
}
图1.1 实例2运行的结果
该程序运行并没有出现错误。但运行结果却不符合需求,我们要求员工的年龄是24岁以上,现实际输出的年龄只有16岁,那么出现这个问题是怎么造成的呢?我们应该怎么样解决呢?
在实例1中,我们可以看出Employee1类的两个属性都是public的,public修饰的属性可以被其它类直接访问,这样的后果是我们没办法控制属性的各个值,因此我们应该把这些属性隐藏起来。
封装是指隐藏属性,方法或实现细节的过程。如果我们使用了封装技术的话,别人就只能访问我们发布的方法和属性,不能访问我们隐藏方法和属性。根据上面的例子出现的问题,我必须要把员工的属性隐藏起来,并为每个一个属性创建赋值方法(setter)和取值方法(getter),用于对这些属性的访问,如实例3所示。
实例3
package org.hopetech.l01;
public class Employee2 {
private String name; // 员工姓名
private int age; // 员工年龄
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 void selfIntroduction() {
System.out.println("我是" + name + ",我今年有" + age + "岁了!");
}
}
This关键字在对象内部指代对象自己本身,当在一个类中要明确指出使用对象自己的属性或方法时就应该加上this引用。
在示例3中,使用private关键修饰的属性,只有在Employee2类中创建该类的对象时,这个对象才能访问,在其它类创建该类对象,都不可能访问这些属性。但我们可以通过赋值方法(setter)和取值方法(getter)来访问这些属性,如实例4所示,运行结果如图1.2。
实例4
package org.hopetech.l01;
public class Employee2Test {
public static void main(String[] args) {
//实例化一个员工
Employee2 employee = new Employee2();
//调用设定员工属性的方法
employee.setName("李东");
employee.setAge(16);
//调用员工自我介绍的方法
employee.selfIntroduction();
}
}
图1.2 实例4运行的结果
上图所示,运行结果还是不符合阿柏泰克员工的龄要求,不过,我们只需要在实例3的基础上进行改造,就可以达到我们的要求了。
怎么解决阿柏泰克员工的年龄赋值问题?其实做法很简单,只要在实例3的赋值方法(setter)中加入对属性访问限制的代码,就能够实现最小年龄的需求。如实例5所示:
实例5
package org.hopetech.l01;
public class Employee3 {
private String name; // 员工姓名
private int age; // 员工年龄
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age<24){
System.out.println("错误!阿柏泰克的员工最小年龄应为24岁!");
this.age = 24;
} else {
this.age = age;
}
}
/**
* 员工进行自我介绍
*/
public void selfIntroduction() {
System.out.println("我是" + name + ",我今年有" + age + "岁了!");
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16657027/viewspace-1041516/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/16657027/viewspace-1041516/