Java继承层次结构

时间:2017-05-04 10:07:26

标签: java inheritance

Rectangle是Parent类,Square是矩形(Parent)的子类。这种关系是否正确?

很明显,正方形在矩形前面更具体,可以与矩形放在IS-A关系中。但是如果我们以这种方式看到内存利用率会更高(在堆中创建square的对象时,实例变量长度和呼吸将分别像矩形一样分配内存)。

然而,我们可以通过将square平行放置到矩形中,仅通过声明Square类中的一个变量来将其减少到一半。因此,在堆中创建square对象时,只会为一个实例变量分配内存。

那么哪种方法会更有效率?

  1. 将Square作为矩形的子项。

    Or
    
  2. 考虑到有效的堆内存利用率,将Square放在继承层次结构中的并行分支上?

  3. 如果我在任何时候出错,请纠正我。

2 个答案:

答案 0 :(得分:0)

继承最好用于表达"是"对象之间的关系。

以下是继承的不当用法:

public class List<E> {
    :
}

public class Vector<E> extends List<E> {
    :
}

你可能会问,&#34;如果Vector使用List的所有功能,那么为什么这是一个糟糕的继承示例?&#34;这不是最理想的,因为Vector不是List。一个结果可能是List类可能以对Vector不重要的方式发展,或者更糟糕的是,它会在Vector中产生安全漏洞或缺陷。在这样的情况下,组合会好得多,即Vector&#34;有一个&#34;列表(而不是强制Vector为列表)。

儿童班真的应该是其父母的一个例子(例如,山地自行车是一辆自行车)。如果它不是,则很可能这种关系不应该由继承层次结构表示。

  

但是如果我们以这种方式看到内存利用率会更高(同时   在堆中创建square的对象,两个实例变量的长度   并且呼吸将像矩形一样单独分配内存

层次结构是一种鼓励代码重用和改进模块化的工具。如果在项目的这个阶段,您担心内存分配,那么您应该选择与Java不同的语言。您使用Java 因为希望获得与抽象和面向对象相关的设计改进。

答案 1 :(得分:0)

您不能确定is-a设计方法是明显的选择。你可以改为以Rectangle作为基数,当宽度等于高度时它将是一个正方形。虽然Square 是-a 矩形,但您也可以使用Rectangle属性对其进行建模。

但我同意在概念上将Square建模为扩展Rectangle似乎更好。

关于降低空间复杂度的问题

这个层次结构现在很简单,所以你问的是这个问题,但假设你正在构建Rectangle,其中包含宽度和高度的操作。这些操作对Square也有效。例如:

public int calculateArea(int width, int height);

如果您从Square扩展Rectangle,则可能会使用相同的方法。现在,要执行此操作,您必须通过构造函数初始化 width height 。你所做的只是设置相同,你可以得到该区域。您不必因任何原因覆盖它。但如果Square是独立的,那么你将如何进行面积计算?您是否可以将其单独插入,以满足与空间复杂性无关的设计考虑。

围绕 width height 构建的所有内容都可以通过Square扩展它。

您建议的节省空间的方法会丢弃代码的可重用性。这就是为什么,最好是扩展Square而不是保存那个内存。

  

那么哪种方法会更有效率?

By putting Square as a child of rectangle.

Or

By Putting Square at a parallel branch in inheritance hierarchy in view of effective heap memory utilization?

您的效率会因丢失代码重用性而付出巨大代价。所以,答案是,“将Square作为矩形的子项。

但是等等......你也可以节省内存!

如果宽度和高度都不是基元,则可以使宽度和高度等引用指向同一个对象而不是两个不同的对象。