现在的位置: 首页 > 综合 > 正文

封装

2013年04月18日 ⁄ 综合 ⁄ 共 1759字 ⁄ 字号 评论关闭

封装是为了数据安全,就是外部不可见,方式是使用private 声明。因为被private声明的属性(比如name)和方法(比如function())只能在自己的类(比如person)内部使用,所以要想在别的类中操作私有属性name,可以在person类中创建public 类型的 setName() 和 getName(),以供外部调用,就可以操作name属性了。

范例1、没有封装的时候

package haizhu.com;
class Person{
	String name;
	int age;
	public void print(){
		System.out.println("name:"+name+"\nage:"+age);
	}
}
public class Text {
	public static void main(String args[]){
		Person p = new Person();
		p.name = "小明";
		p.age = 24;
		p.print();
	}
}

可以看出,在Text类中可以直接使用对象p加后缀的方式调用name属性并赋值。这样的话安全性就不可控,封装之后如下:

范例2:

package haizhu.com;
class Person{
	private String name;					//private声明
	private int age;						//private声明	
	public String getName() {				//public 类型的 getter
		return name;
	}
	public void setName(String name) {		//public 类型的 setter
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}

	public void print(){
		System.out.println("name:"+name+"\nage:"+age);
	}
}
public class Text {
	public static void main(String args[]){
		Person p = new Person();
		p.setName("小明");					//调用 public 类型的方法,来操作封装过的属性
		p.setAge(24);
		p.print();
	}
}

这样的话还是有一个问题,比如如果将年龄赋值为负数:-24,程序是可以正常运行的,我们可以在给年龄赋值的时候加一个判断条件,赋的值为正数的时候才赋值:

范例3:

package haizhu.com;
class Person{
	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>=0 && age<150){
			this.age = age;
		}
	}

	public void print(){
		System.out.println("name:"+name+"\nage:"+age);
	}
}
public class Text {
	public static void main(String args[]){
		Person p = new Person();
		p.setName("小明");
		p.setAge(-24);										//赋值为负数:-24
		p.print();
	}
}

结果:

name:小明
age:0														//负值没有赋值成功,默认值为0

注意:在自己定义的 print() 方法中,name 和 age 前面可以加上this关键字,表示调用这个 print() 方法的这个对象的name和age,但这里没有添加,也是可以的。

	public void print(){
		System.out.println("name:"+this.name+"\nage:"+this.age);		//this 表示调用这个方法的这个当前对象
	}

总结:

使用private进行封装,是因为private的属性和方法只能在自己类中调用,要想操作私有属性,唯一的方法就是创建一个public类型的公共方法供外部调用,这也是在外部类中操作私有属性的唯一方法。

抱歉!评论已关闭.