本章目标
- 掌握封装的产生目的
- 掌握封装的实现
- 掌握setter和getter方法的定义
1、具体内容
1.1、为什么要有封装?
封装就是保护内容。
保证某些属性和方法可以不被外部看见。
观察以下代码,是否存在问题?
class Person{
String name ; // 声明姓名属性
int age ; // 声明年龄属性
public void tell(){
System.out.println("姓名:" + name + ",年龄:" + age) ;
}
};
public class EncDemo01{
public static void main(String arsgh[]){
Person per = new Person() ; // 声明并实例化对象
per.name = "张三" ; // 为name属性赋值
per.age = -30 ; // 为age属性赋值
per.tell() ;
}
};
输出结果:
姓名:张三,年龄:-30
从语法上没有问题,但是从实际角度看,以上的代码不符合要求。
不合适的根本原因在于属性可以直接被外部所访问。
1.2、实现封装
- 为属性封装: private 属性类型 属性名称;
- 为方法封装: private 方法返回值 方法名称(参数列表){ }
class Person{
private String name ; // 声明姓名属性
private int age ; // 声明年龄属性
public void tell(){
System.out.println("姓名:" + name + ",年龄:" + age) ;
}
};
public class EncDemo02{
public static void main(String arsgh[]){
Person per = new Person() ; // 声明并实例化对象
per.name = "张三" ; // 为name属性赋值
per.age = -30 ; // 为age属性赋值
per.tell() ;
}
};
编译时出现以下问题:
Error:(11, 12) java: name可以在Person中访问private
Error:(12, 12) java: age可以在Person中访问private
提示是一个私有的访问权限,则意味着,外部根本无法调用。
1.3、访问封装的内容
因为这些属性肯定要表示出一些实际的意义,那么这些意义的内容肯定应该由外部设定,所以在整个Java中对于封装性的访问就给出了一个明确的原则,此原则必须遵守。
被封装的属性如果需要被访问,则需要编写getter及setter方法完成。
- 例如:现在有一个属性private String name;
Setter(设置): public void setName(String n){ }
Getter(取得): public String getName()
class Person{
private String name ; // 声明姓名属性
private int 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 void tell(){
System.out.println("姓名:" + name + ",年龄:" + age) ;
}
};
public class EncDemo03{
public static void main(String arsgh[]){
Person per = new Person() ; // 声明并实例化对象
per.setName("张三") ; // 调用setter设置姓名
per.setAge(-30) ; // 调用setter设置年龄
per.tell() ; // 输出信息
}
};
输出结果:
姓名:张三,年龄:-30
以上的代码只是可以访问封装属性了,但是并没有加入到检测的措施。如果年龄设置的有问题,则不应该为属性赋值。
现在该在setter、getter哪个方法中加入检验呢?
- setter方法中加入验证。
- getter方法中只是把内容简单的取回即可。
class Person{
private String name ; // 声明姓名属性
private int age ; // 声明年龄属性
public void setName(String n){ // 设置姓名
name = n ;
}
public void setAge(int a){ // 设置年龄
if(a>=0&&a<=150){ // 加入验证
age = a ;
}
}
public String getName(){ // 取得姓名
return name ;
}
public int getAge(){ // 取得年龄
return age ;
}
public void tell(){
System.out.println("姓名:" + name + ",年龄:" + age) ;
}
};
public class EncDemo04{
public static void main(String arsgh[]){
Person per = new Person() ; // 声明并实例化对象
per.setName("张三") ; // 调用setter设置姓名
per.setAge(-30) ; // 调用setter设置年龄
per.tell() ; // 输出信息
}
};
输出结果:
姓名:张三,年龄:0

2、总结
1、封装性的目的
2、setter及getter方法的作用
3、封装性在Java中有很多种形式,private只是最基本的一种形式,也是比较常见的形式。
类的每一个属性都必须封装
网友评论