尚硅谷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;

}