- 封装:告诉我们如何正确设计对象的属性和方法
- 封装的原则:对象代表什么,就得封装对应的数据,并提供数据对应的行为
举个简单的例子便可以更好的理解了,如下有一个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的作用以及封装的好处。
那么使用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的书写要求,不妨尝试一下:
首先创建一个Student类,并对各成员变量使用private修饰;
public static class Student { private String name; private int age; private String sex; }
其次是对各成员变量提供对应的setXxx() / getXxx()方法
public static class Student { private String name; private int age; private String sex; 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 getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
在创建对应方法的时候有个小tips可以快捷生成(使用idea的前提下):
最后是必须提供一个无参构造器,有参构造器可写可不写
public static class Student { private String name; private int age; private String sex; //无参构造器 public Student() { } //含参构造器 public Student(String name, int age, String sex) { this.name = name; this.age = age; this.sex = sex; } }
这里仍然有个小tips可以快捷生成构造器(使用idea的前提下):
在创建过标准JavaBean以后,应该开始实现对其的调用:
//1、无参构造器创建对象封装一个用户信息 Student s = new Student(); s.setName("何同学"); s.setAge(25); s.setSex("男"); System.out.println(s.getName()); System.out.println(s.getAge()); System.out.println(s.getSex()); //输出结果: //何同学 //25 //男 //2、有参构造器创建对象封装一个用户信息 Student s = Student("张同学",18,"女"); System.out.println(s.getName()); System.out.println(s.getAge()); System.out.println(s.getSex()); //输出结果: //张同学 //18 //女