java学习笔记(十)

来源:互联网 发布:kmp算法 数据结构 编辑:程序博客网 时间:2024/05/12 02:53
 

封装

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

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

原创粉丝点击