1、封装
封装可以隐藏实现的细节,让使用者只能通过实现写好的访问方法来访问这些字段,这样一来我们只需要在这些方法中增加逻辑控制,限制对数据的不合理访问。方便数据检查,有利于于保护对象信息的完整性。便于修改,提高代码的可维护性。实现良好的封装,需要从两个方面考虑:
- 把字段(成员变量)和实现细节隐藏起来,不允许外部直接访问
- 把方法暴露出来,让方法控制这些成员变量进行安全的访问和操作
所以,封装的含义是确保对用户隐藏敏感数据。为此,必须:
- 将类变量/属性声明为
private
- 提供公共的get和set方法来访问和更新
private
变量的值
2、get和set方法
文档:Java 修饰符
private
变量只能在同一类中访问(外部类无法访问它)。 但是,如果我们提供公共的get和set方法,则可以访问它们。
get
方法返回变量值,而set
方法设置该值。
两者的语法是,它们以get
或set
开头,后跟变量名,首字母大写:
例如:
public class Person { private String name; // private = 限制访问 // Getter public String getName() { return name; } // Setter public void setName(String newName) { this.name = newName; } }
示例说明
get
方法返回变量name
的值。
set
方法采用参数(newName
),并将其赋值给name
变量。this
关键字用于引用当前对象。
但是,由于name
变量被声明为private
,因此我们不能从此类外部访问它:
例如:
public class Main { public static void main(String[] args) { Person myObj = new Person(); myObj.name = "cjavapy"; // error System.out.println(myObj.name); // error } }
如果将变量声明为public
,应该会输出:
cjavapy
但是,当我们尝试访问private
变量时,会出现错误:
MyClass.java:4: error: name has private access in Person
myObj.name = "cjavapy";
^
MyClass.java:5: error: name has private access in Person
System.out.println(myObj.name);
^
2 errors
我们可以使用getName()
和getName()
方法访问和修改变量:
例如:
public class Main { public static void main(String[] args) { Person myObj = new Person(); myObj.setName("cjavapy"); // 将name变量的值设置为“cjavapy” System.out.println(myObj.getName()); } } // 输出 "cjavapy"
3、封装的好处
- 更好地控制类的属性和方法
- 可以将类属性设置为只读(如果仅使用
get
方法),也可以设置为只写(如果仅使用set方法) - 灵活:程序员可以更改代码的一部分而不影响其他部分
- 增强数据安全性