封装
a.什么是封装?
封装就是把每个对象的数据(属性)和操作(行为)包装在一个类中。即可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
b.封装的设计思想提:供对外的访问接口,隐藏内部的实现方式
c.封装的基本原则
(1)类一般是public
(2)属性一般是private
(3)构造方法一般是public
(4)get、set方法一般是public
例如:
下面代码中的属性姓名、年龄私有,用private封装,这样就只有本类可以访问,其他类都无法访问,如此就实现了对信息的隐藏
public class Person {//类里面可以封装变量、函数
private String name;
private int age;
}
虽然private将属性隐藏起来了,但同时也对每个值提供对外的公共方法访问,也就是说我们可以通过set get方法对私有属性进行访问,例如:
public void setName(String na) {
this.name = na;
}
public String getName() {
return this.name;
}
public void setAge(int age) {
if(age > 0 && age < 120)
this.age = age;
}
public int getAge() {
return age;
}
封装实例
public class Person {//类里面可以封装变量、函数
private String name;//不能直接用,必须给name分配内存
public void setName(String na) {
this.name = na;
}
public String getName() {
return this.name;
}
private int age;
public void setAge(int age) {
if(age > 0 && age < 120)
this.age = age;
}
public int getAge() {
return age;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
采用 this 关键字是为了解决实例变量(private String name)和局部变量(setName(String name)中的name变量)之间发生的同名的冲突。
以上实例中public方法是外部两类访问该类成员变量的入口(通常这些方法被称为getter setter方法),因此任何访问类中的私有成员变量都要通过这些getter和setter方法。
访问方法:(通过set方法传递数据 get方法获取数据)
public class TestPerson {
public static void main(String[] args) {
Person p = new Person();
p.setName("张三");
p.setSex('男');
p.setAge(26);
System.out.println("姓名:" + p.getName() + " 性别:" + p.getSex() + " 年龄:" + p.getAge());
}
}
运行结果:
d.封装的好处
增加代码的复用性
如:
public class Student {
private int id;
private String name;
private char sex;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
if(sex == '男' || sex == '女') {
this.sex = sex;
}
}
}
public class Test {
public static void main(String[] args) {
Student s = new Student();
s.setName("张三");
s.setSex('男');
s.setId(84378);
Student s1 = new Student();
s1.setName("李四");
s1.setSex('女');
s1.setId(84378);
System.out.println("姓名:" + s.getName() + " 性别:" + s.getSex() + " 学号:" + s.getId());
System.out.println("姓名:" + s1.getName() + " 性别:" + s1.getSex() + " 学号:" + s1.getId());
}
}
显然对代码一次一次的调用很麻烦,那么我们就可以使用一个函数将其封装起来,这样就减少了代码的累赘,如:
public class Student {
private int id;
private String name;
private char sex;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
if(sex == '男' || sex == '女') {
this.sex = sex;
}
}
public void setProp(String name,int id,char sex) {
this.setName(name);
this.setSex(sex);
this.setId(id);
}
}
public class Test {
public static void main(String[] args) {
Student s = new Student();
s.setProp("张三",87495,'女');
System.out.println("姓名:" + s.getName() + " 性别:" + s.getSex() + " 学号:" + s.getId());
}
}