Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 封装与信息隐藏_Java_Oop_Encapsulation_Information Hiding - Fatal编程技术网

Java 封装与信息隐藏

Java 封装与信息隐藏,java,oop,encapsulation,information-hiding,Java,Oop,Encapsulation,Information Hiding,封装和信息隐藏之间到底有什么区别 我知道,将字段设置为私有,然后将字段的setter和getter设置为私有,这就是封装。然而,封装就意味着这一点吗 假设我有一个如下所述的类 public Class IsThisEncapsulation { public int age; public void setAge(int age) { this.age=age; } public int getAge() { ret

封装和信息隐藏之间到底有什么区别

我知道,将字段设置为私有,然后将字段的setter和getter设置为私有,这就是封装。然而,封装就意味着这一点吗

假设我有一个如下所述的类

public Class IsThisEncapsulation
{
    public int age;

    public void setAge(int age)
    {
       this.age=age;
    }

    public int getAge()
    {
       return age;
    }
}
现在,类
是否是封装的一个示例

现在,将上述类中的字段“age”设为private会实现信息隐藏吗

你能给我举个清楚的例子来帮助我清楚地区分这些概念吗

抽象和封装是互补的概念:抽象关注对象的可观察行为。。。封装主要关注导致这种行为的实现。。。封装通常是通过信息隐藏来实现的,信息隐藏是隐藏对象的所有秘密的过程,这些秘密与对象的基本特征无关

信息隐藏:

“其界面或定义的选择是为了尽可能少地揭示其内部工作原理。”——[Parnas,1972b]

“抽象可以[…]用作确定哪些信息应该隐藏的技术。”

“当人们无法区分信息的隐藏和用来帮助识别哪些信息要隐藏的技术(如抽象)时,就会产生混淆。”

封装:

“它[…]指的是围绕一些东西的集合建造一个胶囊,在这种情况下是一个概念上的障碍。”——[Wirfs Brock等人,1990年]

“作为一个过程,封装是指将一个或多个项目封装在[…]容器中的行为。封装作为一个实体,是指包含(包含)一个或多个项目的包或外壳。”

“如果封装是‘与信息隐藏相同的事情’,那么有人可能会说‘封装的所有东西都是隐藏的’,这显然不是真的。”


这两者之间有微妙的区别,我喜欢Steve Freeman和Nat Pryce撰写的《测试引导面向对象软件的发展》一书中的描述:

上面说:

封装

确保对象的行为只能通过其API受到影响。 它让我们可以控制对一个对象的更改会对该对象的其他部分产生多大的影响 通过确保系统之间没有意外的依赖关系 不相关的组件

信息隐藏

隐藏对象如何在抽象背后实现其功能 它的API。它允许我们通过忽略较低级别的细节来处理较高的抽象
与手头的任务无关。

请看它们的字面意思。 封装就是把东西放在一个袋子里。 i、 将所有属性和方法放在一个类中可以实现封装 然而,在一定程度上,您还可以通过封装实现信息隐藏。
访问修饰符在封装中不起作用,但在信息隐藏中起作用。

要回答您的问题:

信息隐藏:隐藏对象的基本部分,这些部分公开了对象内部的实现方式,并公开了更高的抽象。例如:在电视遥控器中,我们只接触到与电视交互的按键,我们不知道里面有什么

封装:封装将数据和方法结合起来,并允许公共方法访问内部数据。所以,是的,如果在你的类中,你将变量年龄,私有化,你将实现封装

我知道,将字段设置为私有,然后将字段的setter和getter设置为私有,这就是封装。然而,封装是否就意味着这一点

--->封装是一个OOP概念,其中对象状态(类字段)及其行为(方法)被包装在一起。Java使用
class
提供封装

信息隐藏:

-->限制访问某些对象组件的机制。如果将
age
设置为私有,则上述示例就是信息隐藏的例子


最初,信息/数据隐藏被认为是封装的一部分,封装的定义如下:

  • 一种语言机制,用于限制对某些对象组件的访问
  • 一种便于将数据与操作该数据的方法(或其他函数)捆绑在一起的语言结构
第二个定义的动机是,在许多OOP语言中,组件的隐藏不是自动的,或者可以被覆盖;因此,喜欢第二种定义的人将信息隐藏定义为一个单独的概念


参考资料:

封装和信息隐藏是紧密相连的概念,尽管它们的精确定义因与谁交谈而有所不同

“信息隐藏”的概念首先由世卫组织提出,即应限制对信息的访问,以减少系统的互联性。他提议,这将有助于将一个系统分为几个模块,同时保持一个用户友好的外部界面,并允许在不影响客户的情况下更改实施细节

术语“封装”是由发明的,用于描述使用过程来控制对底层数据的访问,以降低系统复杂性并保护数据不受危险修改的影响

随后,将信息隐藏和封装(以及抽象)描述为同义词,这些同义词描述了隐藏可能更改的系统细节。然而,在信息隐藏和封装之间已经有了区别,例如,who将封装描述为“严格执行信息隐藏”。一些作者,如和描述了“封装机制”,特别是
public class BankAccount {
    public int dollars;
}
public class BankAccount {
    private int dollars;

    public void deposit(int dollars) {
        this.dollars += Math.max(0, dollars);
    }
}
public class BankAccount {
    private int cents;

    public void deposit(int dollars) {
        deposit(dollars, 0);
    }

    public void deposit(int dollars, int cents) {
        this.cents += Math.max(0, 100 * dollars) + Math.max(0, cents);
    }
}
class NoEncapsulationOrInformationHiding { 
   public ArrayList widths = new ArrayList();
}

class EncapsulationWithoutInformationHiding {
   private ArrayList widths = new ArrayList();
   public ArrayList getWidths(){
    return widths;
  }
}

class InformationHidingWithoutEncapsulation {
   public List widths = new ArrayList();
}

class EncapsulationAndInformationHiding{
  private ArrayList widths = new ArrayList();
  public List getWidths(){
    return widths;
  }
}