当前位置: 首页 > 面试题库 >

封装与普通

拓拔嘉颖
2023-03-14
问题内容

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

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

但是我可以在不使用封装的情况下使用此好处,对吗?因为每个对象的字段都彼此不同。

// 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());
  }
}

问题答案:

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

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

但是我们可以定义一个接口,即公共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());
    } 
}

优点

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

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

3)其他用户将不知道 幕后情况 。他们只会知道,要更新数据,我们需要调用settter方法并获取数据,而我们需要调用getter方法。



 类似资料:
  • 问题内容: 封装和信息隐藏之间到底有什么区别? 好吧,我知道将字段设为私有,然后将字段的setter和getter设为封装。但是封装只是这个意思吗? 假设我有一个如下所述的课程。 现在,类IsThisEncapsulation是封装的示例吗? 现在将上述类中的“年龄”字段设为私有可以实现信息隐藏吗? 您能给我清楚的例子,以帮助我清楚地区分这些概念吗? 问题答案: 好吧,我知道将字段设为私有,然后将

  • 6.6. 封装 一个对象的变量或者方法如果对调用方是不可见的话,一般就被定义为“封装”。封装有时候也被叫做信息隐藏,同时也是面向对象编程最关键的一个方面。 Go语言只有一种控制可见性的手段:大写首字母的标识符会从定义它们的包中被导出,小写字母的则不会。这种限制包内成员的方式同样适用于struct或者一个类型的方法。因而如果我们想要封装一个对象,我们必须将其定义为一个struct。 这也就是前面的小

  • prototype对象 构造函数的缺点 prototype属性的作用 原型链 constructor属性 Object.getPrototypeOf方法 Object.create方法 isPrototypeOf方法 prototype对象 构造函数的缺点 JavaScript通过构造函数生成新对象,因此构造函数可以视为对象的模板。实例对象的属性和方法,可以定义在构造函数内部。 function

  • 问题内容: 美好的一天! 我正在阅读一本有关封装的Java书,其中提到了getter和setter方法。 我读过要隐藏属性,我必须将实例变量标记为 “ PRIVATE” ,并设置 “ PUBLIC” 方法来访问数据。因此,我尝试制作类似但并非常规的代码,如下所示: 上面的代码是否因为我直接分配变量而公开了变量?我该如何做得更好?如果改用常规方法并在另一个类上分配值会更好吗?“隐藏数据”是什么意思?

  • 我今天有个面试。我有一个来自OOP的问题,关于封装之间的区别 我告诉她,封装基本上是绑定数据成员 在提出这个问题之前,我阅读了StackOverFlow上的其他线程,了解这两个OOPs概念之间的区别。但我发现自己无法说服面试官。 有人能举个最简单的例子来证明吗?

  • 总结之前的内容,对象(object)指代某一事物,类(class)指代象的类型。对象可以有状态和动作,即数据成员和方法。 到现在为止,数据成员和方法都是同时开放给内部和外部的。在对象内部,我们利用this来调用对象的数据成员和方法。在对象外部,比如当我们在另一个类中调用对象的时,可以使用 对象.数据成员 和 对象.方法() 来调用对象的数据成员和方法。 我们将要封装(encapsulation)对