访问控制符

public

  • 任何人都可以访问

protected ( 目录/包 级别的访问控制 )

  • 只有子类和 同一个包 (目录下的文件) 的可以访问

包级私有 - 不加限定符 ( 目录/包 级别的访问控制 )

  • 只有 同一个包 (目录) 中的类可以访问
  • 注意: 包之间是 没有嵌套包含关系 的 (虽然在目录结构上可能有嵌套关系).

    • 即: xxx.bbb 包 下的类并不能访问 xxx.bbb.aaa 包 下的 package private 类.
      1. public class Person {
      2. int id; // 不加任何访问限定符的时候, 它就是包级私有的.
      3. }

      private ✔️

  • 只有类自己可以访问.

  • 当我们需要封装的时候, 我们需要使用 private, 将它的成员隐藏起来.

JavaBean 🥔 规范

image.png

什么是JavaBean ? JavaBean 规范

特征:

  • 1. 所有属性都是私有的.
    1. 有一个 public 的无参构造器.
    1. 属性可以通过 get、set、is(可以替代get,用在布尔型属性上)方法或遵循特定命名规范的其他方法访问。
    1. 可序列化
  • getter 名约定

    • 对于非布尔值, getter 名为: getFieldname
    • 对于布尔值, getter 函数名为: isFieldname
  • setter 名约定

    • setter 函数名均为 setFieldname

      1. public class Person {
      2. private int id=1000;
      3. private boolean male;
      4. public Person(){ }
      5. public int getId() { return id; }
      6. public void setId(int id) { this.id = id; }
      7. public boolean isMale() { return male; }
      8. public void setMale(boolean male) { this.male = male; }
      9. }
  • 封装应该尽可能的隐藏 内部细节, 仅仅暴露出接口.

  • JavaBean 类的成员 全部都通过 getter, setter 方法 封装起来了.

JavaBean 的应用

  • JSON 相关类库, 例如 fastjson 包, 会根据 JavaBean 中的 getter setter 来进行序列化反序列化.

    • fastjson 在生成 JSON 文本时 , 是通过 实例对象中 符合 JavaBean 约定的 getter 来获得的, 它并不关心实例成员实际的值.
    • 同样地, 在反序列化时, 它根据类中的 setter 来生成对象.
  • 如果没有为 字段定义 符合 JavaBean 约定的 getter , 那么序列化后只能得到一个空的 JSON 对象 { }

  • 示例1: ```java public class Cat { private String name; private boolean cute; public Cat(String name, boolean cute) {

    1. this.name = name;
    2. this.cute = cute;

    } public String getName() {

    1. return name;

    } public void setName(String name) {

    1. this.name = name;

    } public boolean isCute() {

    1. return cute;

    } public void setCute(boolean cute) {

    1. this.cute = cute;

    } public static void main(String[] args) {

    1. Cat cat = new Cat("Kitty", true);
    2. System.out.println(JSON.toJSONString(cat));

    } }

// output {“cute”:true,”name”:”Kitty”}

  1. <br />
  2. - 示例 2<br />
  3. - **对 json 进行读写时,** **只看符合 JavaBean 约定的 getter / setter 方法, 不看实际的属性**.
  4. ```java
  5. public class Cat {
  6. public Cat() { }
  7. public String getName() {
  8. return "1111";
  9. }
  10. public void setName(String name) { }
  11. public String isCute() { return "heyheyhey"; }
  12. public void setCute(boolean cute) {}
  13. public static void main(String[] args) {
  14. Cat cat = new Cat();
  15. System.out.println(JSON.toJSONString(cat));
  16. }
  17. }
  18. // output
  19. {"name":"1111"}

使用 IDEA 生成 getter, setter

  • 使用 Idea 生成 getter 时, getter 方法和 setter 方法名是固定格式的 :
    • getFieldName
    • setFieldName
      1. public class Person {
      2. private int id=1000;
      3. public int getId() {
      4. return id;
      5. }
      6. public void setId(int id) {
      7. this.id = id;
      8. }
      9. }