【问题标题】:Practical example Encapsulation vs Information Hiding vs Abstraction vs Data Hiding in JavaJava中的实际示例封装vs信息隐藏vs抽象vs数据隐藏
【发布时间】:2013-11-25 12:46:32
【问题描述】:

我知道有很多关于这个问题的帖子都有实时示例的理论解释。这些 OOP 术语是 非常简单,但对于像我这样的初学者来说更容易混淆。 但是我在这里期待的不是定义和实时示例,而是期待 java 中的代码 sn-p

谁能为每个Java提供非常小的代码sn-p,这将有助于我理解封装vs信息隐藏vs抽象vs实际隐藏数据?

【问题讨论】:

  • 信息隐藏是封装的另一种说法。以允许客户端恶意(或意外)破坏对象状态的方式让不受信任(或什至受信任)的客户端访问对象的状态是一件非常糟糕的事情。对象的状态应尽最大可能对外界隐藏。

标签: java oop abstraction information-hiding data-hiding


【解决方案1】:

封装=信息隐藏=数据隐藏。执行某些任务不需要他人知道的信息。

class Bartender {
  private boolean hasBeer = false;
  public boolean willGiveBeerToDrinker(int drinkerAge) {
    return (hasBeer && (drinkerAge >= 21));
  }
}

class Drinker {
  private Bartender bartender = new Bartender();
  private int age = 18;
  public boolean willBartenderGiveMeBeer() {
    return bartender.willGiveBeerToDrinker(age);
  }
  // Drinker doesn't know how much beer Bartender has
}

抽象 = 同一接口的不同实现。

public interface Car {
  public void start();
  public void stop();
}

class HotRod implements Car {
  // implement methods
}

class BattleTank implements Car {
  // implement methods
}

class GoCart implements Car {
  // implement methods
}

实现都是唯一的,但可以绑定在Car类型下。

【讨论】:

  • 您的意思是当我们进行封装时......信息和数据隐藏也出现在图片(代码)中。如果错了,请纠正我。数据和信息隐藏是实现封装的方式,是实现抽象的方式。我说的对吗?
  • 是的——所有这些概念在 OOP 中都紧密联系在一起。封装就是将程序细节隐藏在不需要看到的事物中。抽象是将相关对象之间的共同行为联系在一起。
  • 您已经给出了使用 Car 接口进行抽象的示例。抽象是隐藏不必要的信息并显示重要信息。然后我们隐藏的内容和我们在上面的类示例中显示的内容。这里我有点困惑。跨度>
  • interface 的全部意义在于提供与Car 层次结构中的对象交互的通用方式。我给出的 3 个示例可能会有非常不同的实现——但它们仍然可以像使用相同类型一样使用。这个想法是隐藏实现的“幕后”细节,同时公开单个 API。
  • 封装不是隐藏程序细节,而是将所有数据成员和操作这些数据成员的方法收集在一个容器中,可以实现不隐藏数据的封装但无法实现数据隐藏而不封装。
【解决方案2】:

为了减少混淆:

封装用于信息隐藏或数据隐藏

封装意味着自包含。 Java 中的所有对象都有一组数据和对这些数据进行操作的方法。所以任何对象的用户都不必担心对象是如何工作的。这样您就可以隐藏信息和其他复杂性。

示例:任何 Java 对象都足以代表一个示例。

抽象:这意味着将事物通用化,即,当您创建基类或接口然后扩展它们以获得您的特定类时,而不是创建一个非常具体的类。

示例: 类动物{} 狮子类扩展动物{}

因此,对于 Lion 类,您有一个通用类,即 Animal。这代表抽象

注意 KepaniHaole 给出的例子是完美的。

抽象示例:

public interface Animal{
    public String getType();
}

class Lion implements Animal {
    private String animalType = "WILD";

    @Override
    public String getType() {
        return this.animalType;
    }
}
class Cow implements Animal {
    private String animalType = "Domestic";

    @Override
    public String getType() {
        return this.animalType;
    }
}

在本例中,LionCow 类实现了 Animal 接口。 LionCowoverride Animal 接口的 getType 方法。

这里 Lion 和 Cow 是特例,而 Animal 则更笼统。所以这给了你抽象,因为每当你有一个 Animal 时,你都有 getType 方法来知道它的类型,也就是说,你已经概括了它。

现在,如果您注意到我在 LionCow 类中将 animalType 设为私有,这样类外的任何人都无法修改它.这样我就可以从外部对象中隐藏不需要的信息。

所有外部对象需要的是 getType 方法来知道动物的类型。这样我只将相关信息暴露给外部对象。

【讨论】:

  • 如果错了,请纠正我。数据和信息隐藏是实现封装的方式,是实现抽象的方式。我说的对吗?
  • 我会说其他方式:当我们进行封装时......信息和数据隐藏也会出现。所以encapsulation 是一种实现这种隐藏的方法,当你把事情变得通用时,抽象就会出现。
  • 能否请您给出一个非常简短的 java 中使用接口的抽象示例,请解释我们如何隐藏 not imp 以及如何显示 imp 信息。谢谢
猜你喜欢
  • 2018-06-29
  • 1970-01-01
  • 2021-07-24
  • 2020-12-10
  • 1970-01-01
  • 2017-02-05
  • 2020-04-09
  • 2013-04-19
  • 2011-06-10
相关资源
最近更新 更多