第五课:类的封装性

时间:2021-08-10 04:38:14

  观察下面的代码:

class Person{
	String name ;
	int age ;
	public void tell(){
		System.out.println("姓名:" + name +",年龄:" + age) ;
	}
}
public class SimpleDemo{
	public static void main(String args[]){
		Person per = new Person() ;
		per.name = "张三" ;
		per.age = -30 ;
		per.tell() ;
	}
}

  如果现在的年龄为负数,并不会影响程序的执行。但是从实际的生活角度来讲,没有一个人的年龄是-30岁。所以这样的数据就不应该设置上去。

  因为现在类中的所有操作都是对外部可见的,可以直接访问的。此时就可以通过风合租昂性来解决此问题,在Java中封装性有很多的体现,但是最简单的体现就是加入“private”关键字。

    封装属性:private 数据类型 属性名称 = 默认值 ;

    封装方法:private 返回值类型|void 方法名称(参数列表) 

  那么下面按照此操作将类中的属性进行封装:

    private String name ;

    private int age ;

  这是编译会发生错误,提示name和age属性是使用private关键字声明的,所以无法在外部直接访问。证明现在的属性是安全的,可以自己保护了。

  但是,现在代码是安全了,但是无法操作,那么该怎么办呢?

  所以,给出一个重要的概念:只要属性就必须进行封装,被封装的属性通过setter及getter方法设置和取得,例如:name属性,setter:setName(),getter:getName()

class Person{
	private String name ;
	private int age ;
	public void tell(){
		System.out.println("姓名:" + name +",年龄:" + age) ;
	}
	public void setName(String n){
		name = n ;
	}
	public void setAge(int a){
		age = a ;
	}
	public String getName(){
		return name ;
	}
	public int getAge(){
		return age ;
	}
}
public class SimpleDemo{
	public static void main(String args[]){
		Person per = new Person() ;
		per.setName("张三") ;
		per.setAge(3) ;
		per.tell() ;
	}
}

  此时,已经可以访问类中的name和age属性,是通过间接的方式完成,但是此时并没有对输入的内容进行检查。

public void setAge(int a){
		if(a>=0&&a<100){
		age = a ;
		}
	}

  在访问本类中其他方法时,为了保证方法是本类中定义的,可以在方法前加上this关键字:this.方法(),就是调用本类的方法。

  最终代码:

class Person{
	private String name ;
	private int age ;
	public void tell(){
		System.out.println("姓名:" + this.getName() +",年龄:" + this.getAge()) ;
	}
	public void setName(String n){
		name = n ;
	}
	public void setAge(int a){
		if(a>=0&&a<100){
		age = a ;
		}
	}
	public String getName(){
		return name ;
	}
	public int getAge(){
		return age ;
	}
}
public class SimpleDemo{
	public static void main(String args[]){
		Person per = new Person() ;
		per.setName("张三") ;
		per.setAge(30) ;
		per.tell() ;
	}
}

 

 

【2011-11-28】