封装是为了数据安全,就是外部不可见,方式是使用private 声明。因为被private声明的属性(比如name)和方法(比如function())只能在自己的类(比如person)内部使用,所以要想在别的类中操作私有属性name,可以在person类中创建public 类型的 setName() 和 getName(),以供外部调用,就可以操作name属性了。
范例1、没有封装的时候
package haizhu.com; class Person{ String name; int age; public void print(){ System.out.println("name:"+name+"\nage:"+age); } } public class Text { public static void main(String args[]){ Person p = new Person(); p.name = "小明"; p.age = 24; p.print(); } }
可以看出,在Text类中可以直接使用对象p加后缀的方式调用name属性并赋值。这样的话安全性就不可控,封装之后如下:
范例2:
package haizhu.com; class Person{ private String name; //private声明 private int age; //private声明 public String getName() { //public 类型的 getter return name; } public void setName(String name) { //public 类型的 setter this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void print(){ System.out.println("name:"+name+"\nage:"+age); } } public class Text { public static void main(String args[]){ Person p = new Person(); p.setName("小明"); //调用 public 类型的方法,来操作封装过的属性 p.setAge(24); p.print(); } }
这样的话还是有一个问题,比如如果将年龄赋值为负数:-24,程序是可以正常运行的,我们可以在给年龄赋值的时候加一个判断条件,赋的值为正数的时候才赋值:
范例3:
package haizhu.com; class Person{ private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { //增加判断条件 if(age>=0 && age<150){ this.age = age; } } public void print(){ System.out.println("name:"+name+"\nage:"+age); } } public class Text { public static void main(String args[]){ Person p = new Person(); p.setName("小明"); p.setAge(-24); //赋值为负数:-24 p.print(); } }
结果:
name:小明 age:0 //负值没有赋值成功,默认值为0
注意:在自己定义的 print() 方法中,name 和 age 前面可以加上this关键字,表示调用这个 print() 方法的这个对象的name和age,但这里没有添加,也是可以的。
public void print(){ System.out.println("name:"+this.name+"\nage:"+this.age); //this 表示调用这个方法的这个当前对象 }
总结:
使用private进行封装,是因为private的属性和方法只能在自己类中调用,要想操作私有属性,唯一的方法就是创建一个public类型的公共方法供外部调用,这也是在外部类中操作私有属性的唯一方法。