封装定义
定义
封装,即隐藏对象的属性和实现细节,仅对外公开接口(生成的get和set方法),当我们需要使用其属性和方法时,只能通过公开的接口去使用它,而无法更改它。
作用
封装的作用或者说好处有4个:
- 安全:防止了错误的更改或破坏原来的程序,只能通过公共接口访问它。
- 隔离变化:无法观察其过程,只能获得结果。
- 操作简单:不用复杂的去写其他方法,只需要调用通过公共接口访问就行。
- 可重用:因为无法被破坏,所以可以重复使用它。
有无封装的区别示例
无封装:
package com.ecapsolution;
//无封装的测试类
public class Test01 {
public static void main(String[] args) {
Student student = new Student();
//正常状态
student.age = 19;
student.name = "lili";
student.gender = "male";
student.studentID = 100010;
//异常状态
student.age = -10;
student.name = null;
student.gender = "傻瓜";
student.studentID = -100000;
//这时依然不会出错,类打印一下
System.out.println(student.age);
System.out.println(student.name);
System.out.println(student.studentID);
System.out.println(student.gender);
}
}
结果是:
-10
null
-100000
傻瓜
这就违背了原来的想法
加入封装后:
package com.ecapsolution;
//有封装的测试类
public class Test02 {
public static void main(String[] args) {
Student01 student1 = new Student01();
//这时就会出现“The field Student01.age is not visible”错误,说明无法对封装后的属性进行更改
student1.age = -10;
student1.name = null;
student1.gender = "傻瓜";
student1.studentID = -100000;
}
}
封装后的访问
那么封装后要怎么访问它呢?
为此,我们引用了公共的方法去访问它,也就是成对的get和set方法
如下:
package com.ecapsolution;
//有封装
public class Student01 {
private String name;
private int age;
private String gender;
private int studentID;
public static void study() {
System.out.println("Student can study hard");
}
public Student01() {
super();
// TODO Auto-generated constructor stub
}
public Student01(String name, int age, String gender, int studentID) {
super();
this.name = name;
this.age = age;
this.gender = gender;
this.studentID = studentID;
}
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 int getStudentID() {
return studentID;
}
public void setStudentID(int studentID) {
this.studentID = studentID;
}
@Override
public String toString() {
return "Student01 [name=" + name + ", age=" + age + ", gender=" + gender + ", studentID=" + studentID + "]";
}
}
测试类:
package com.ecapsolution;
//有封装的测试类
public class Test02 {
public static void main(String[] args) {
Student01 student1 = new Student01();
student1.setAge(20);
student1.setGender("female");
student1.setName("xiaoqian");
student1.setStudentID(100101);
System.out.println(student1);
}
}
构造函数
上面程序大家可能注意到了一个东西:
public Student01() {
super();
// TODO Auto-generated constructor stub
}
public Student01(String name, int age, String gender, int studentID) {
super();
this.name = name;
this.age = age;
this.gender = gender;
this.studentID = studentID;
}
那么这是什么呢?
这就是构造函数,虽然平常我们在使用的时候没看见它的存在,但实际上它都是存在的,默认调用父类的无参构造函数:
public Student01() {
}
如果有需要,我们可以自己编写自己的有参构造函数:
public Student01(String name, int age, String gender, int studentID) {
super();
this.name = name;
this.age = age;
this.gender = gender;
this.studentID = studentID;
}
这里用到了一个关键字“this”,它表示当前的对象;比如this.name = name;就是表示当前传入的name=这里的name。
总结
封装一般用private来修饰,同时生成一对对应的set 和get方法用于别人的调用。
构造函数与普通函数的区别:
- 普通函数表示对象具有的功能,构造函数为对象的初始化内容;
- 执行方式不同,构造函数是在创建对象时有jvm调用,普通函数只有在被调用时才会执行;
- 普通函数可以多次调用,构造函数只能在创建对象时使用;
- 构造函数没有返回值类型。
结语
今天的分享就到这里了,同以前一样,如果有不完善或者有不明了的地方,欢迎大家的留言,谢谢!