Java 基础系列(一) --- 对封装的理解
1 什么是封装
封装的本质就是让类的调用者不必太多的了解类的实现者是如何实现的, 只要知道如何使用类就行了, 这样就降低了类使用者的学习和使用成本, 也降低了代码的复杂程度.
2 封装的好处
如果直接使用 public , 如下代码所示:
class Human { public String name = "Lee"; public String sex = "男"; public int age = 25; } public class demo2 { public static void main(String[] args) { Human human = new Human(); System.out.println("我的名字叫 " + human.name + ", 性别 " + human.sex + ", 今年 " + human.age + "岁!"); } }
运行结果: 代码解读:
-
类的使用者必须要清楚 Human 类内部的实现才能够使用这个类, 学习成本高; 一旦类的实现着修改了代码, 也就是 Human 类中的 name 改成了 names, name类的调用者就需要大规模的修改自己的代码, 维护成本比较高.
因此, 我们可以使用 private 来封装属性, 并提供 public 方法来供类的调用者来使用. 代码如下:
class Humans { private String name = "Lee"; private String sex = "男"; private int age = 25; public void show() { System.out.println("我的名字叫 " + name + ", 性别 " + sex + ", 今年 " + age + "岁."); } } public class demo3 { public static void main(String[] args) { Humans humans = new Humans(); humans.show(); } }
运行结果: 代码解读:
-
此时name 字段等使用 private 来修饰, 这时候类的调用者就不能直接使用 name, sex, age 这几个字段, 也就是 main 方法中不能直接使用他们, 而是借助 show()来实现, 此时类的使用者就不必了解 Humans 类的实现细节; 如果类的实现者修改了字段的名字, 类的调用者也不需要进行修改, 因为调用者根本就访问不到 name, sex, age 这几个字段; private 不光能修饰字段, 也能修饰方法; 通常情况下我们会把字段设置为 private 属性, 但是方法是否需要设为 public, 就需要视情况而定了, 一般我们希望一个类只提供必要的 public 方法, 而不应该是把所有的方法都设为 public.
3 getter 和 setter 方法
如上 2 中的代码, 如果在main 方法中直接对 name 等字段进行赋值是不可取的, 例如 humans.age = 19; humans.show(); 这时候代码就会报错, 如下所示: 因此如果想要进行对其赋值就必须使用 getter / setter 方法, 代码如下所示
class Humans { private String name = "Lee"; private String sex = "男"; private int age = 25; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void show() { System.out.println("我的名字叫 " + name + ", 性别 " + sex + ", 今年 " + age + "岁."); } } public class demo3 { public static void main(String[] args) { Humans humans = new Humans(); humans.show(); System.out.println("==================="); humans.setName("Fug"); humans.setAge(19); humans.setSex("man"); humans.show(); } }
运行结果: 注意事项:
-
当 set 方法中的形参名字和类中的成员属性的名字一致的时候, 如果不使用 this, 相当于自赋值, this 表示当前实例的引用; 不是所有的字段都一定要提供 setter / getter 方法, 要根据实际情况来决定提供哪种方法.