Java中的抽象与封装[重复]

2020/12/12 05:21 · java ·  · 0评论

可能重复:
抽象VS信息隐藏VS封装

我知道这个问题可能在这个论坛上被问过数千遍,即使net也充满了关于这些概念的很多定义,但是听起来都一样,并且都使用了相同的技术词汇。例如以下定义

封装是将数据和对数据进行操作的代码绑定或包装到单个实体中的过程。这样可以确保数据不受外部接口和滥用的影响。考虑封装的一种方法是作为保护性包装程序,以防止代码和数据被包装程序外定义的其他代码任意访问。

从上面的定义中我可以理解的是,创建变量,将它们标记为私有并为这些变量生成getter-setter,并使用object访问这些getter和setter。这样,数据就隐藏在对象内部,并且只能通过对象访问。希望我是对的


抽象是Java中的过程,用于隐藏某些细节并仅显示对象的基本功能。换句话说,它处理对象(接口)的外部视图。

现在,这部分总是让我感到困惑。每当我想到抽象时,想到的就是Abstract类(可能是因为它们都有Abstract关键字)。上面的定义说抽象意味着隐藏数据并仅显示必需的细节,但这就是我们在封装中已经在做的事情吧?那有什么区别 我也没有得到对象的侧面视图,它涉及对象的外部视图

有人可以通过一些实际示例或一些编程示例来对此进行更多说明。

OO抽象过程中一流水平的设计时,用客观的隐藏实现复杂是如何在由API /设计/系统提供的功能得以实施,在一定意义上简化了“接口”来访问底层的实现。

可以在越来越“高级”的类(层)中重复抽象的过程,这使得可以构建大型系统而不会增加代码的复杂性和每一层的理解。

例如,Java开发人员可以使用FileInputStream的高级功能,而不必担心它的工作方式(即文件句柄,文件系统安全性检查,内存分配和缓冲将在内部进行管理,并且对使用者隐藏)。这样FileInputStream就可以更改的实现,并且只要API(接口)FileInputStream保持一致,针对以前版本构建的代码仍然可以使用。

同样,在设计自己的类时,您将希望尽可能地向其他人隐藏内部实现细节。

在Booch定义1中 OO封装是通过信息隐藏实现的,尤其是在隐藏类实例所拥有的内部数据(表示状态的字段/成员)的周围,通过以受控方式强制访问内部数据并防止直接访问,这些字段的外部更改,以及隐藏该类的任何内部实现方法(例如,通过将它们设为私有)。

例如,private默认情况下可以创建一个类的字段,并且仅当需要外部访问这些字段时,才会从该类中暴露aget()和/或set()(或Property)。(在现代的OO语言中,字段可以标记为readonly/ final/ immutable,这甚至限制了类中的更改)。

未应用任何信息隐藏的示例(不良做法)

class Foo {
   // BAD - NOT Encapsulated - code external to the class can change this field directly
   // Class Foo has no control over the range of values which could be set.
   public int notEncapsulated;
}

已应用字段封装的示例

class Bar {
   // Improvement - access restricted only to this class
   private int encapsulatedPercentageField;

   // The state of Bar (and its fields) can now be changed in a controlled manner
   public void setEncapsulatedField(int percentageValue) {
      if (percentageValue >= 0 && percentageValue <= 100) {
          encapsulatedPercentageField = percentageValue;
      }
      // else throw ... out of range
   }
}

字段的不可变/仅构造函数初始化的示例

class Baz {
   private final int immutableField;

   public void Baz(int onlyValue) {
      // ... As above, can also check that onlyValue is valid
      immutableField = onlyValue;
   }
   // Further change of `immutableField` outside of the constructor is NOT permitted, even within the same class 
}

回复:抽象与抽象类

抽象类是促进重用类之间的公共性的类,但是它们本身不能直接用new()-实例化抽象类,并且只能concrete(非抽象)子类进行实例化。两者之间可能造成混淆的Abstraction一个原因abstract class是,在OO的早期,继承被更多地用于实现代码重用(例如,与关联的抽象基类一起使用)。如今,合成通常比继承受青睐,并且有更多可用的工具来实现抽象,例如通过接口,事件/委托/函数,特征/混合等。

Re:封装与信息隐藏

封装的含义似乎随着时间的流逝而发展,最近,encapsulation在确定将哪些方法,字段,属性,事件等捆绑到一个类中通常也可以在更一般的意义上使用

引用维基百科:

在面向对象编程语言的更具体设置中,该概念用于表示信息隐藏机制,捆绑机制或两者的组合。

例如,在语句中

我已经数据访问代码封装到了自己的类中

..封装的解释大致等同于“关注点分离”或“单一职责负责人”(SOLID中的“ S”),并且可以说可以用作重构的同义词。


[1]一旦您看到了Booch的封装猫图片,您将永远不会忘记封装-《面向对象的分析和设计与应用》,第2版p46

简而言之:在决定要实现的内容时要进行抽象。在隐藏已实现的内容时进行封装。

抽象是关于识别通用性并减少在代码的不同级别上必须使用的功能。

例如,我可能会Vehicle上课。ACar会衍生自a Vehiclea也会衍生自Motorbike我可以向每个人询问Vehicle车轮,乘客等的数量,并且该信息已从Cars和中提取并标识为常见信息Motorbikes

在我的代码中,我通常可以Vehicles通过常用方法等进行处理。稍后go()stop()当我添加新的Vehicle类型时(例如Scooter),我的大部分代码将仍然没有注意到这一事实,并且Scooter单独执行时会担心Scooter特殊性。

本文地址:http://java.askforanswer.com/javazhongdechouxiangyufengzhuangzhongfu.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!