封装
概述
如何更好的进行封装?
- 一般建议对成员变量使用private(私有、隐藏)关键字修饰(private修饰的成员只能在当前类中访问)
举个简单的例子便可以更好的理解了,如下有一个Student类,在其中定义了一个成员变量age。
public static class Student{
int age; //未定义修饰符的,默认为public
}
然而此时在另外一个Java文件中,创建了一个Student类的对象s,对Student类中的成员变量age进行访问,并且对其进行赋值。
public class HelloWorld {
public static void main(String[] args) {
Student s = new Student();
s.age = -100;
System.out.println(s.age); //-100
}
}
虽然对Student类中的成员变量age赋值为-100并不会报错,但是这样的情况是违背客观事实的,因此这样的变量是不能够被随意更改的,对于我们储存数据是不方便的。
此时我们如果把封装引入的话,会有什么变化呢?仍然是定义一个Stduent类,并且定义一个成员变量age,与之前不同的地方是不再默认修饰符public定义成员变量,而是使用private来修饰,(通过翻译我们可以得知,二者分别是public:“共有的,公共的”,private:“私有的,个人的”)
public static class Student{
private int age; //在原有的基础上加入了private修饰符
}
之后如果要在另外一个Java文件中,创建了一个Student类的对象s,对Student类中的成员变量age进行访问的时候,会出现报错的提示,不允许我们访问Student类中的成员变量age。
public class HelloWorld {
public static void main(String[] args) {
Student s = new Student();
s.age; //会出现报错!!!
}
}
由此我们可以清晰的理解对成员变量使用private的作用以及封装的好处。
- 为每个成员变量提供配套public修饰的getter(获取)、setter(设置)方法暴露其取值和赋值
那么使用private修饰符对其保护的话,该如何对类中的成员变量访问呢?当然是有办法的,可以通过在类中定义方法对它访问,既加以限制,又不完全限制。下面重新定义Student类,在原来的基础之上创建getAge()与setAge()方法,用来对成员变量age访问。
public static class Student {
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
if (age > 0 && age < 150) {
this.age = age;
}else {
System.out.println("年龄输入有误!");
}
}
}
那么此时我们应该如何对成员变量age进行访问呢?通过引用Student类中的方法实现访问。
Student s = new Student();
s.setAge(20); //对age访问并赋值
System.out.println(s.getAge()); //对age访问并获取其值
标准JavaBean
- 也可以称为实体类,其对象可以用于在程序中封装数据。(所谓实体类,类似于学生类、汽车类等在现实生活中出现的)
标准JavaBean应当的书写要求:
- 成员变量使用private修饰;
- 提供成员变量对应的setXxx() / getXxx()方法;
- 必须提供一个无参构造器,有参构造器可写可不写。
既然给出了标准JavaBean的书写要求,不妨尝试一下: