`
googlelc
  • 浏览: 55383 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java学习笔记(十)

 
阅读更多

封装

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致死最基本的一种形式,也是一种比较常见的形式

#类中的每一个属性都必须封装

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics