4

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

任何人都可以为Java中的每个提供非常小的代码片段,这将有助于我实际理解封装、信息隐藏、抽象和数据隐藏?

4

2 回答 2

17

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

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类型下。

于 2013-11-13T04:02:05.333 回答
5

为了减少混淆:

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

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

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

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

示例: class Animal {} class Lion 扩展 Animal{}

因此,对于 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接口。LionCowoverrideAnimal接口的getType方法。

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

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

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

于 2013-11-13T04:31:17.070 回答