2

我对java中的抽象有点困惑。

我检查了许多页面,说明抽象是数据隐藏(隐藏实现)。

我对抽象的理解是它是“部分实现”。只需在抽象类/接口中定义您需要的内容,然后扩展/实现它们并添加您自己的功能。

我不明白这是如何隐藏数据?实现类/接口后,您将可以访问代码,并根据需要对其进行修改。

我已经检查了很多关于此的问题和文章,但仍然对此感到困惑。

任何帮助表示赞赏。谢谢。

4

9 回答 9

2

也许一个例子可以帮助你更好。假设您要实现一个 Graph 类,该类可能具有邻接列表或邻接矩阵来表示其节点。因此,抽象地说,您至少要在此图中“添加节点”“添加边缘”:

public abstract class Graph
{
    public abstract int addNode();
    public abstract void addEdge(int from, int to);
}

现在您可以扩展两个类:

public class GraphAdjList extends Graph
{
    private Map<Integer,ArrayList<Integer>> adjListsMap;
    public int addNode()
    {
        //list based implementation 
    }
    public void addEdge(int from, int to)
    {
        //list based implementation
    }
}

public class GraphAdjMatrix extends Graph
{
    private int[][] adjMatrix;
    public int addNode()
    {
        //matrix based implementation 
    }
    public void addEdge(int from, int to)
    {
        //matrix based implementation
    }
}

当您从这两个类中调用任何一个 addEdge 时,您不必担心它背后的数据结构,您只知道您得到了您需要的结果,例如:

Graph g1,g2;
g1 = new GraphAdjList();
g2 = new GraphAdjMatrix();

g1.addEdge(1,2);
g2.addEdge(1,2);

通过多态性,您可以调用两个不同的函数,但得到与 Graph 客户端相同的结果。

另一个现实生活中的例子是汽车刹车。作为汽车客户,制造商在不知道后端制动的实现方式的情况下为您提供了一个踏板来推动。它可以是后部的鼓式制动器或盘式制动器。你只需要踩刹车!

于 2016-05-10T07:08:33.983 回答
2

您将抽象(编程模式)与Java 语言的abstract关键字混淆了。尽管有相似之处,但它们在语义上只是非常轻微的相关。

  • 抽象意味着您从使用类或方法的代码中隐藏实现细节。使用您的方法的代码不需要知道您正在实现一个列表,使用数组或动态指针或嵌入式数据库或文件系统中的文件。

  • abstract用于标记具有仅声明而未实现的方法的类。它是“抽象的”,因为它们不能被实例化,你不能从这些类中创建任何实例(但你可以从它们的具体子类中创建它们)。

于 2016-05-10T07:00:01.773 回答
1

ArrayList数据隐藏是指您不阅读文档就无法理解如何在内部使用 API(例如, )。API 创建者不提供对其中基础数组的任何访问权限。

您对将使用它的用户隐藏 API 实现。他们不应该担心它在内部是如何工作的,他们只对提供给他们的功能感兴趣。

一篇很好的文章

于 2016-05-10T06:53:55.727 回答
1

我不确定这是否能回答您的问题,但如果您一般谈论的是抽象类,它们可以为子类提供扩展它的功能,而子类不必知道或处理实现(它对子类的用户隐藏)。

我们以汽车为例:

public abstract class Vehicle {
    protected int _numberOfWheels;
    public Vehicle() {
        this._numberOfWheels = 4;
    }
}

public class Truck extends Vehicle {
    public int carryingLoad;
    public Truck() {
        this.carryingLoad = 4000; // kg or something
    }
}

因此,车辆是车辆对象的抽象实例,并且已经具有与之关联的一些功能,例如车轮的数量。这是一个受保护的方法,所以如果我创建一个新的卡车实例:

// Inside main
Truck truck = new Truck();

但是,如果我要在类中为卡车编写一个函数,我无法更改轮子的数量,例如:

// Inside the Truck class
public void addSpareTire() {
    this._numberOfWheels++;
}

所以我可以这样称呼它:

// Inside main
truck.addSpareTire();

我仍然可以与一些变量进行交互,但只能通过扩展抽象类的类中的函数。我可以通过调用一次添加一个轮胎,但我永远无法从我使用对象的主函数addSpareTire()直接交互,但我可以从类声明内部。对于卡车对象的用户,该信息是隐藏的。_numberOfWheelsTruckTruck

我不知道这是不是你要求的。希望这可以帮助。

于 2016-05-10T07:04:04.703 回答
1

在面向对象的编程中,抽象是一个向用户隐藏实现细节的过程,只有功能才会提供给用户。换句话说,用户将获得关于对象做什么而不是它如何做的信息。

查看以下链接了解更多详情: http: //www.visionsdeveloper.com/tutorial/java/java-abstraction.jsp

于 2016-05-10T07:04:22.077 回答
1

实现类/接口后,您将可以访问代码,并根据需要对其进行修改。

我猜你对这里的语言给你的概念有点困惑Abstraction。您始终可以访问自己的代码,但是像AbstractionOR这样的东西Polymorphism为您提供了理想的方式。所以Abstraction你只是说我知道会有一个名称someThing为抽象方法的行为,但现在你不知道它会如何表现,实现者会告诉我们这将如何。请参阅以下代码。

abstract class Game{
 public abstract void play();
}

class Football extends Game{
  @Override
  public abstract void play(){
      // write how football play
  }
}

class Cricket extends Game{
  @Override
  public abstract void play(){
      // write how Cricket play
  }
}

我在这里给你留下一个问题。

Why you are making class level attributes public/protected/private although you have access to the code when you implement?

于 2016-05-10T07:16:13.047 回答
1

我认为你对两件事感到困惑

  1. OOP 中的抽象概念及其在 Java 中的实现
  2. java中的抽象类

  3. 摘要:有一个称为抽象的 OOP 概念。在这里,用户可以捕获对象的必要特征。这个抽象概念在java中实现为类和对象。因此,向您提出问题,数据隐藏,当您以类的形式捕获对象的重要特征时,这些特征只能对其自己的类的对象访问。在这里,您将一个班级的所有特征隐藏在班级/世界之外。所以,它被称为数据隐藏

  4. 抽象类:这是 Java 实现的特性。如果您不知道完整的实现,那么您可以选择 java 的抽象类。

希望这可以帮助您了解一点

谢谢

于 2016-05-10T07:22:16.087 回答
0

数据隐藏基本上是隐藏有关类的内部数据成员的详细信息,并且仅授予相关类对其的访问权限。

因此,它避免了应用程序中其他类或任何其他应用程序的不必要渗透,这意味着其他类不能直接访问私有成员变量。

因此,您可以通过这种方式抽象相关类的内部细节。

于 2016-05-10T07:03:47.777 回答
0

它不是向您隐藏信息,而是向您的抽象客户隐藏信息。看看这个例子。

public class Demo {
    Client client = new Client(new Implementation());
}

public interface Abtraction {
    void doWork();
}

public class Implementation implements Abtraction{
    @Override
    public void doWork() {
        //doingTheWork
    }
}

public class Client{
    private Abtraction theAbstraction;

    public Client(Abstraction theAbstraction){
        this.theAbstraction = theAbstraction;
    }
}

该类Client不知道 的实现Abstraction,这意味着Demo该类可以提供不同的实现而Abstraction不会弄乱Client.

于 2016-05-10T07:02:16.713 回答