Java 面向对象 封装

封装(Encapsulation) 是面向对象编程的重要特性之一,通过将对象的属性和方法封装在类内部,并提供受控的访问方式,达到数据保护、隐藏实现细节和模块化设计的目的。封装是实现 Java 面向对象编程的核心机制之一,能够有效提高代码质量和系统的可维护性。本文主要介绍Java 封装。

1、封装

封装可以隐藏实现的细节,让使用者只能通过实现写好的访问方法来访问这些字段,这样一来我们只需要在这些方法中增加逻辑控制,限制对数据的不合理访问。方便数据检查,有利于于保护对象信息的完整性。便于修改,提高代码的可维护性。实现良好的封装,需要从两个方面考虑

1)把字段(成员变量)和实现细节隐藏起来,不允许外部直接访问

2)把方法暴露出来,让方法控制这些成员变量进行安全的访问和操作

所以,封装的含义是确保对用户隐藏敏感数据。为此,必须将类变量/属性声明为private,提供公共的getset方法来访问和更新private变量的值

文档Java 面向对象编程(OOP)

2、get和set方法

文档Java 修饰符

private变量只能在同一类中访问(外部类无法访问它)。 但是,如果我们提供公共的getset方法,则可以访问它们。

get方法返回变量值,而set方法设置该值。

两者的语法是,它们以getset开头,后跟变量名,首字母大写:

例如:

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、封装的好处

1)增强代码的安全性

通过访问控制符保护数据,防止不必要的修改或不当使用。

2)提高代码的可维护性

隐藏实现细节,外部不需要关注类的具体实现,方便后续修改和扩展。

3)遵循开闭原则

通过封装,类对扩展开放,对修改封闭。

4)提高代码的可读性和复用性

类的设计更模块化,易于复用。

    推荐阅读
    cjavapy编程之路首页