尚硅谷JavaSE基础
6.2.2 成员私有化
只需要把类中的成员使用private修饰就是私有化了, 而一旦成员被私有化, 这个成员也称为被封装了
注意 : 代码块不能封装
public class Teacher { private String name; // 对象属性 private int age; private String gender;
// 对象方法 public void lesson() { System.out.println(name + “老师在上课”); }
public void eat(String something) { System.out.println("老师在吃" + something); } // 描述对象的详细信息, 把所有的属性值串接成一个字符串 public String say() { String str = "姓名:" + name + ",年龄:" + age + ",性别:" + gender; return str; }
} |
6.2.3 封装的问题
public class TeacherTest { public static void main(String[] args) { Teacher t = new Teacher(); // 下面的语句都不能执行了, 因为在测试类中,不能直接跨类访问别的类中的私有成员 //t.name = “张三”; //t.age = 30; //t.gender = “男”; //System.out.println(t.name); //System.out.println(t.age); //System.out.println(t.age);
} } |
.1. get/set方法
因为成员一旦私有化, 就不可以在其他类中直接访问了, 但是在其他类中仍然有访问的需求, 成员之间是可以互相访问的, 所以解决这个问题的方法就是在本类中添加一些公共方法, 通过方法间接访问类中的私有成员.
public class Teacher {
private String name = "某老师"; // 实例变量, 私有化属性, 封装 private int age = 30; // 当属性被私有化时, 只能在本类中使用 private String gender = "男"; // 用于间接设置name属性, 所以方法必须公共的 public void setName(String n) { name = n; } // 用于间接获取name属性, 所以方法必须公共的 public String getName() { return name; } public void setGender(String g) { gender = g; } public String getGender() { return gender; } public void setAge(int age) { this.age = age; } // get方法有返回值, 没有参数 public int getAge() { return age; } // 实例方法 public void lesson() { System.out.println(name + "老师在上课"); // 成员可以互访 } public void eat(String something) { System.out.println("老师在吃" + something); } // 描述对象的详细信息, 把所有的属性值串接成一个字符串 public String say() { String str = "姓名:" + name + ",年龄:" + age + ",性别:" + gender; return str; } } |
2.间接访问属性
public class TeacherTest { public static void main(String[] args) { Teacher t = new Teacher(); t.setName("张老师");// 通过方法设置属性 t.setAge(30); t.setGender("男"); System.out.println(t.getName()); System.out.println(t.getAge());// 通过方法获取属性 System.out.println(t.getGender()); } } |
3. 为什么要封装
如果不使用封装而直接访问对象的属性, 就可以给属性赋上一些不合理的数据值, 比如
t.age = 50000; // 显然这个操作是应该失败的, 因为年龄不合理
但是如果通过方法来赋值, 就可以把这种错误拦截住
相同的道理, 如果要获取某个属性, 但是需要在内部再处理一下, 也可以通过方法来实现
// 保护数据 public void setAge(int a) { if (a > 120 || a < 0) { // 当参数中传入的数据不合理时, 方法直接返回, 不给对象的属性赋值 return; } age = a; } |