在JAVA中,有一种很重要的东西叫封装(JAVA三大特性之一),简单来说,就是你不想让别人接触的东西可以自己锁起来,想让别人接触的东西,可以自己直接暴露出来 ,当然,这只是个比喻,因为封装并不是那么简单的。
什么 是封装:
提高数据安全属性,通过封装,隐藏属性和细节,提供接口给外部访问、调用
========================================================================================
未封装的class类,是可以随意访问的
class ClassObject{
// 以下属性可以直接访问,并不会报错
String name;
Integer age;
public void printObject(){
System.out.println(name+"今年"+age+"岁了");
}
}
class Test{
public static void main(String[] args){
ClassObject classObject = new ClassObject();
//name/age并没有封装限制访问权限,所以可以直接访问、赋值
classObject.name ="小明";
classObject.age = 10;
classObject.printObject();
}
}
结果:小明今年10岁了
===========================================================================================================================
封装关键字之private,将属性或方法设置为私有的,只有在本类中方可使用
class ClassObject{
//被private封装的属性或方法,在外部是无法直接使用的,只能在本类中方可使用
private String name;
Integer age;
public void printObject(){
System.out.println(name+"今年"+age+"岁了");
}
}
class Test{
public static void main(String[] args){
ClassObject classObject = new ClassObject();
//name被private设置成了私有的,不能在外部访问
classObject.name ="小明";
classObject.age = 10;
classObject.printObject();
}
}
运行结果:
F:\a>javac -encoding utf-8 ClassObject.java
ClassObject.java:14: 错误: name可以在ClassObject中访问private
classObject.name ="小明";
^
1 个错误
那么如果所有的属性都被private限制了访问权限,再想访问、赋值给一些属性要如何操作?
答案很简单:写一个接口,开放给外部使用,这样可以控制用户的输入的数据,以达到拦截检测的效果
class ClassObject{
//被private封装的属性或方法,在外部是无法直接使用的,只能在本类中方可使用
private String name;
private Integer age;
//开放接口给外部类调用,实现给属性name/age赋值的目地
public void setName(String val){
name = val;
}
public void setAge(int val){
age = val;
}
public void printObject(){
System.out.println(name+"今年"+age+"岁了");
}
}
class Test{
public static void main(String[] args){
ClassObject classObject = new ClassObject();
//name被private设置成了私有的,不能在外部访问
//classObject.name ="小明";
//classObject.age = 10;
//ClassObject类中的属性,可以通过我们提供的setName/setAge接口进行赋值
classObject.setName("小二");
classObject.setAge(10);
classObject.printObject();
}
}
==============================================================================================================
name/age属性被限制了外部的访问,如果我想获取ClassObject中的属性值 怎么办?
答案是:再写一个返回属性值 的方法
class ClassObject{
//被private封装的属性或方法,在外部是无法直接使用的,只能在本类中方可使用
private String name;
private Integer age;
//开放接口给外部类调用,实现给属性name/age赋值的目地
public void setName(String val){
name = val;
}
public void setAge(int val){
age = val;
}
//开放获取name/age属性值 的方法
public String getName(){
return name;
}
public Integer getAge(){
return age;
}
public void printObject(){
System.out.println(name+"今年"+age+"岁了");
}
}
class Test{
public static void main(String[] args){
ClassObject classObject = new ClassObject();
//name被private设置成了私有的,不能在外部访问
//classObject.name ="小明";
//classObject.age = 10;
//ClassObject类中的属性,可以通过我们提供的setName/setAge接口进行赋值
classObject.setName("小二");
classObject.setAge(10);
classObject.printObject();
//获取classObject类中的name/age属性值
String name = classObject.getName();
Integer age = classObject.getAge();
System.out.println("从classObject获取的name值为:"+name);
System.out.println("从classObject获取的age值为:"+age);
}
}
运行结果:
小二今年10岁了
从classObject获取的name值为:小二
从classObject获取的age值为:10