封装
1:封装的目的:
封装就是保护内容,保证某些属性或方法可以不被外部看见。
class Person{
String name;
int age;
public void tell(){
System.out.println("姓名:"+name+" 年龄:"+age);
}
}
public class test06
{
public static void main(String args[]){
Person per1 = null;
Person per2 = null;
per1 = new Person();
per2 = new Person();
//Person per = null;
//per = new Person();
per1.name="张三";
per1.age = 30;
per2.name="李四";
per2.age = 33;
per2 = per1;//把per1的堆内存空间使用权给per2
per1.tell();
per2.tell();
}
}
此时如果把per1.age = 30;语句改为per1.age = -30;
class Person{
String name;
int age;
public void tell(){
System.out.println("姓名:"+name+" 年龄:"+age);
}
}
public class test06
{
public static void main(String args[]){
Person per1 = null;
Person per2 = null;
per1 = new Person();
per2 = new Person();
//Person per = null;
//per = new Person();
per1.name="张三";
per1.age = -30;
per2.name="李四";
per2.age = 33;
per2 = per1;//把per1的堆内存空间使用权给per2
per1.tell();
per2.tell();
}
}
后,在java语法上没有任何问题,但是从实际角度看,以上的代码绝对不符合要求。
为什么呢?
#因为没有人的年龄是负数。
而不合适的根本原因在与此处让属性可以直接被外部所访问。
此时只能通过封装解决:
2:封装实现:
为属性封装:private 属性类型 属性名称
为方法封装:private 方法返回值 方法名称(参数列表){}
class Person{
private String name;
private int age;
public void tell(){
System.out.println("姓名:"+name+" 年龄:"+age);
}
}
public class test06
{
public static void main(String args[]){
Person per1 = null;
Person per2 = null;
per1 = new Person();
per2 = new Person();
//Person per = null;
//per = new Person();
per1.name="张三";
per1.age = -30;
per1.tell();
}
}
此时再次编译,出现问题:
F:\test>javac test06.java
test06.java:17: name 可以在 Person 中访问 private
per1.name="张三";
^
test06.java:18: age 可以在 Person 中访问 private
per1.age = -30;
^
2 错误
提示是一个私有的访问权限,则意味着,外部根本就无法调用。
3:访问封装的内容
因为这些属性肯定是要表示出一些实际的意义,那么这些有意义的内容肯定应该有外部设定,所以在整个java中对于封装性的访问就给出了一个明确的原则,此原则必须遵守。
被封装的属性如果需要被访问,则需要编写setter及getter方法完成。
如: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 test06
{
public static void main(String args[]){
Person per1 = null;
Person per2 = null;
per1 = new Person();
per1.setName("张三");
per1.setAge(-30);
per1.tell();
}
}
此时程序运行结果如下:
F:\test>javac test06.java
F:\test>javac test06.java
F:\test>java test06
姓名:张三 年龄:-30
注:
以上的代码只是可以访问封装属性了,但是并没有加入检错错误的措施。
如果年龄设置的有问题,则不应该为属性赋值。
在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 test06
{
public static void main(String args[]){
Person per1 = null;
Person per2 = null;
per1 = new Person();
per1.setName("张三");
per1.setAge(-30);
per1.tell();
}
}
结果为:
F:\test>javac test06.java
F:\test>java test06
姓名:张三 年龄:0
总结:
#封装性在java中有很多形式,private致死最基本的一种形式,也是一种比较常见的形式
#类中的每一个属性都必须封装