2020-11-25

封装定义

定义

封装,即隐藏对象的属性和实现细节,仅对外公开接口(生成的get和set方法),当我们需要使用其属性和方法时,只能通过公开的接口去使用它,而无法更改它。

作用

封装的作用或者说好处有4个:

  1. 安全:防止了错误的更改或破坏原来的程序,只能通过公共接口访问它。
  2. 隔离变化:无法观察其过程,只能获得结果。
  3. 操作简单:不用复杂的去写其他方法,只需要调用通过公共接口访问就行。
  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方法用于别人的调用。
构造函数与普通函数的区别:

  1. 普通函数表示对象具有的功能,构造函数为对象的初始化内容;
  2. 执行方式不同,构造函数是在创建对象时有jvm调用,普通函数只有在被调用时才会执行;
  3. 普通函数可以多次调用,构造函数只能在创建对象时使用;
  4. 构造函数没有返回值类型。

结语

今天的分享就到这里了,同以前一样,如果有不完善或者有不明了的地方,欢迎大家的留言,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值