1.2 封装

为什么要用封装

什么是封装

怎样实现封装

[@more@]

1.2.1 为什么要用封装

我们通一个案例来分析一下

(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修饰的属性可以被其它类直接访问,这样的后果是我们没办法控制属性的各个值,因此我们应该把这些属性隐藏起来。

1.2.2 什么是封装

封装是指隐藏属性,方法或实现细节的过程。如果我们使用了封装技术的话,别人就只能访问我们发布的方法和属性,不能访问我们隐藏方法和属性。根据上面的例子出现的问题,我必须要把员工的属性隐藏起来,并为每个一个属性创建赋值方法(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的基础上进行改造,就可以达到我们的要求了。

1.2.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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值