对象和数据结构之间有什么区别?

对象和数据结构之间有什么区别?,第1张

对象数据结构之间有什么区别?

在Java中比在C 中更难解释数据结构和类/对象之间的区别。在C语言中,没有类,只有数据结构,无非是类型字段和命名字段的“容器”。C

继承了这些“结构”,因此您可以同时拥有“经典”数据结构和“真实对象”。

在Java中,您可以使用没有方法并且只有公共字段的类“模拟” C样式的数据结构:

public class VehicleStruct{    public Engine engine;    public Wheel[] wheels;}

使用者

VehicleStruct
了解车辆的零件,并可以直接与这些零件交互。行为,即功能,必须在类之外定义。这就是为什么更改行为很容易的原因:添加新功能不需要更改现有代码。另一方面,更改数据实际上需要更改与交互的每个功能
VehicleStruct
。它违反了封装!

OOP背后的想法是隐藏数据并公开行为。它着重于您可以 车辆 执行的 *** 作 ,而不必知道它是否具有引擎或安装了多少个车轮:

public class Vehicle{    private Details hidden;    public void startEngine() { ... }    public void shiftInto(int gear) { ... }    public void accelerate(double amount) { ... }    public void brake(double amount) { ... }}

请注意,它们

Vehicle
可能是摩托车,汽车,卡车或油箱-您无需了解详细信息。更改数据很容易-
班级以外的人都不了解数据,因此无需更改该类的用户。更改行为很困难:在向类添加新(抽象)函数时,必须调整所有子类。

现在,按照“封装规则”,您可以理解隐藏数据只是将字段设为私有并将访问器方法添加到

VehicleStruct

public class VehicleStruct{    private Engine engine;    private Wheel[] wheels;    public Engine getEngine() { return engine; }    public Wheel[] getWheels() { return wheels; }}

鲍勃叔叔在他的书中认为,通过这样做,您仍然具有数据结构而不是对象。您仍然只是将车辆建模为零件的总和,并使用方法公开这些零件。它与具有公共字段和普通旧C的版本基本相同

struct
-因此是数据结构。隐藏数据和公开方法不足以创建对象,您必须考虑这些方法实际上是公开
行为 还是仅公开数据!

当您将两种方法混合使用时(例如

getEngine()
与一起使用)
startEngine()
,最终会出现“混合”现象。我手头没有马丁书,但我记得他根本不推荐混合动力车,因为最终会遇到两全其美的局面:数据和行为都难以改变的对象。

您对HashMaps和Strings的问题有些棘手,因为它们的级别很低,并且不太适合您要为应用程序编写的类。但是,使用上面给出的定义,您应该能够回答它们。

A

HashMap
是一个对象。它向您展示其行为,并隐藏所有令人讨厌的哈希详细信息。你告诉它
put
get
数据,并不在乎其散列函数被使用,多少个“桶”有,而且冲突的处理方式。实际上,您
HashMap
仅通过其
Map
接口使用,这很好地表示了抽象和“真实”对象。

不要混淆,可以使用Map 实例 代替数据结构!

// A data structurepublic class Point {    public int x;    public int y;}// A Map _instance_ used instead of a data structure!Map<String, Integer> data = new HashMap<>();data.put("x", 1);data.put("y", 2);

String
另一方面,A
几乎是一个字符数组,并且不会尝试将其隐藏得太多。我想可以将其称为数据结构,但是老实说,我不确定是否可以通过一种方法或其他方法获得大量收益。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5427324.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存