封装与普通封装

Tra*_*nee 5 java encapsulation

如果下面的代码会产生相同的结果,为什么我应该使用封装?

封装的主要好处是能够修改我们实现的代码,而不会破坏使用我们代码的其他人的代码。

但我可以在不使用封装的情况下使用这个好处,对吗?因为每个物体的场都彼此不同。

// Person.java
public class Person {
  // Plain
  public String name;

  // Uses encapsulation
  private String name2;
  public void setName(String name2) {
    this.name2 = name2;
  }
  public String getName() {
    return name2;
  }
}

// Main.java
public class Main() {
  public static void main(String[] args) {
    // Plain
    Person person = new Person();
    person.name = "Jordan";
    System.out.println(person.name);

    // Uses encapsulation
    Person person2=new Person();
    person2.setName("Jordan");
    System.out.println(person2.getName());
  }
}
Run Code Online (Sandbox Code Playgroud)

Ari*_*Roy 1

你的问题很有趣。我将尽力为您深入解答。

封装背后的主要思想是向其他用户隐藏数据及其实现细节。如果我们将数据成员设为私有,那么它只能在同一个类中访问。没有其他类可以直接访问该数据。

但我们可以定义一个接口,即公共 getter 和 setter 方法来更新其他类的数据。这可确保其他人无法访问私有数据,并且只能通过您提供的公共方法访问。

例如,您可能决定只为特定数据成员提供 getter 方法,而不提供 setter 方法。这确保没有其他类可以以任何可能的方式更改或更新您的数据成员。他们只能使用 getter 方法获取值。

这就是为什么封装也称为数据隐藏

例子

public class EncapsulationDemo{
    private int ssn;
    private String empName;
    private int empAge;

    //Getter and Setter methods
    public int getEmpSSN(){
        return ssn;
    }

    public String getEmpName(){
        return empName;
    }

    public int getEmpAge(){
        return empAge;
    }

    public void setEmpAge(int newValue){
        empAge = newValue;
    }

    public void setEmpName(String newValue){
        empName = newValue;
    }

    public void setEmpSSN(int newValue){
        ssn = newValue;
    }
}
public class EncapsTest{
    public static void main(String args[]){
         EncapsulationDemo obj = new EncapsulationDemo();
         obj.setEmpName("Mario");
         obj.setEmpAge(32);
         obj.setEmpSSN(112233);
         System.out.println("Employee Name: " + obj.getEmpName());
         System.out.println("Employee SSN: " + obj.getEmpSSN());
         System.out.println("Employee Age: " + obj.getEmpAge());
    } 
}
Run Code Online (Sandbox Code Playgroud)

优点

1)它为代码提供了灵活性并使其易于维护。我们可以更改getEmpName()setEmpName()不影响任何其他外部代码的实现。

2) 我们可以随时将数据成员设置为只读(仅定义 getter)或只写(仅定义 setter)。

3)其他用户将不知道幕后发生了什么。他们只会知道要更新数据,我们需要调用 setter 方法,而要获取数据,我们需要调用 getter 方法。