程序中经常出现通过某个对象的直接访问其 Field 的情况,这会存在一系列的问题,比如定义一个 Person 的对 象,其中有 age 这样一个属性,如果将属性值赋值为 1000,虽然程序不会出错,但是逻辑是错误的,人不可能活 1000 岁。那么就需要将这个变量给藏起来,在 Java 中使用 private 关键字可以起到隐藏效果。因此通常将成员变量定义使 用 private 关键字进行修饰,然后通过方法的方式向外提供服务。
面向对象编程语言是对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改。 封装可以被认为是一个保护屏障,防止该类的代码和数据被其他类随意访问。要访问该类的数据,必须通过指定的方 式。适当的封装可以让代码更容易理解与维护,也加强了代码的安全性。
将属性隐藏起来,若需要访问某个属性,提供公共方法对其访问。
1、使用 private 关键字来修饰成员变量。
2、对需要访问的成员变量,提供对应的一对 getXxx 方法 、setXxx 方法。
1、private 是一个权限修饰符,代表最小权限。
2、可以修饰成员变量和成员方法。
3、被 private 修饰后的成员变量和成员方法,只在本类中才能访问。
private 数据类型 变量名 ;
代码如下:
public class Student {
// 成员变量
private String name;// 姓名
private int age;// 年龄
private String gender;// 性别
private String address;// 地址
public String getName() {
return name;
}
public void setName(String name) {
name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
gender = gender;
}
public String getAddress() {
return address;}
public void setAddress(String address) {
address = address;
}
}
分析:在 Student 这个类中,将属性隐藏起来后,外面的其他来再想通过 Student 类的对象直接访问属性已经 是不可能的了。只能通过对象提供的 set 方法对属性操作,如果对属性进行不合理的赋值时,在 set 方法中就可以通过逻辑加以控制。
经过测试我们发现参数赋值失败,因为在 Student(String name,int age)构造方法中的赋值语句使用的变量都是 形参中的变量 name,age。这里如何才能拿到成员变量 name,age 呢?这时可以借助 this 关键字来区分同名的局 部变量与成员变量。 Java 提供了一个 this 关键字,this 关键字总是指向调用该方法的对象。根据 this 出现位置的不同,this 作为对 象的默认引用有两种情况: 1、构造器中引用,this 指的是该构造器正在初始化的对象。 2、在方法中引用,this 指的是调用该方法的对象。 这两种情况可以概括成一句,即 this 代表当前对象。this 关键字最大的作用就是让类中一个方法,访问该类里的另一个方法或 Field。
this 使用格式:this.成员变量名;
示例代码 1:
public class Student {
// 成员变量
private String name;// 姓名
private int age;// 年龄
private String gender;// 性别
private String address;// 地址
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getAddress() {
return address;
}
public void printMsg(String msg) {
System.out.println("消息内容:" + msg);
}
public void compare(int a, int b) {
if (a > b) {
this.printMsg("a 大于 B");
} else {
printMsg("b 大于 a");
}
}
public static void main(String[] args) {
Test obj = new Test();
obj.compare(2, 3);
}
}
分析:在方法 compare 比较中进行数值 a 与 b 的比较大小,当 a 大于 b 时,调用 printMsg 方法进行信息输出, 当 b 大于 a 时,同样调用 printMsg 方法进行信息输出。因为 compare 方法与 printMsg 方法都定义在一个类中, 所以当创建一个对象 obj 时,compare 方法与 printMsg 方法都属于这个对象。当通过 obj 调用 compare 方法时, compare 中的 this.printMsg 表示的还是 obj 这个当前对象上的 printMsg 方法。在默认情况下,因为调用关系都是 对象本身的方法或者 Field,所以 this 可以省略。
JavaBean 是 Java 语言编写类的一种标准规范。符合 JavaBean 的类,要求类必须是具体的和公共的,并且具 有无参数的构造方法,提供用来操作成员变量的 set 和 get 方法。
public class ClassName {
// 成员变量
// 构造方法// 无参构造方法【必须】
// 有参构造方法【建议】
// 成员方法
// getXxx()
// setXxx()
}
编写符合 JavaBean 规范的类,以学生类为例,标准代码如下:
public class Student {
// 成员变量
private String name;
private int age;
private String gender;
private String address;
// 构造方法
public Student() {
}
// 成员方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}