第五课:类的封装性
观察下面的代码:
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】