构图与内部类

时间:2016-11-01 13:21:56

标签: java inner-classes composition

构图和内部阶级之间有什么不同和相似之处? 我正在尝试学习Java的原理并尝试找出整个图像。对我来说,最好是进行类比,并观察概念之间的差异和相似之处,以便将其用于核心。

成分定义: “组合是在类中实现有关系的设计技术”。 “Java组合是通过使用引用其他对象的实例变量来实现的”

内部类(或成员类,非匿名)的定义: “成员类也被定义为封闭类的成员,但不使用static修饰符声明。这种类型的内部类类似于实例方法或字段。成员类的实例始终与实例相关联封闭类的代码,以及成员类的代码可以访问所有字段和方法“

因此,通过面对这两个定义,我看到了一些相似之处:

1. Both have HAS-A relationship
2. Both are strictly dependent on the outer class lifetime
3. can be declared private

的差异:

1. Inner classes uses classes, composition use instances (?!)
2. In composition no restriction to use the variables of the "outer" class

如果我完全错了,请纠正我,我需要更好地追踪两个概念的限制。

3 个答案:

答案 0 :(得分:3)

这两个相关词是相关的。为了更好地组织我的,我们定义A和B:

  • A是由内部类组成的类成员。
  • B是由外部类的实例组成的类成员。

示例:

class Driver {
}

class Car {

    // A
    class Engine {
        void start() {
            if (gasLevel > 0) {
                ...
            }
        }
    }

    //B
    Driver driver;

    int gasLevel;

}

那说:

  • A是一个字段
  • B是一个字段
  • A是内部类
  • B不是内部类
  • A可以访问Car内部状态(gasLevel)
  • B无法访问Car internal state(gasLevel)
  • 引擎不存在没有Car的实例。
  • 驱动程序不存在Car实例。

总而言之,两个不同类之间的组合以及内部类的组合是控制系统耦合和内聚水平的方法。

答案 1 :(得分:1)

你是对的,组合和内部类都实现了“有一个”方案,但它们有很多不同。

组合是指您的类具有另一个类的实例作为实例变量(有时称为字段)。

public class A {
    B otherObject;
    /* Other fields and methods go here */
}
在这种情况下,

otherObject只是对类型B的另一个对象的实例的引用.otherObject可以独立于您的A实例存在,并且A的多个实例可以引用同一个B.

内部类是类定义实际包含在外部类中的时候。

public class C {
    class D {
        /* Inner class stuff goes here */
    }
}

这主要用于逻辑分组。在这种情况下,D直接与C相关联,而B可能是也可能不是A的逻辑子代。在C外部对D的访问变得稍微复杂一些,但它只能通过现有的C实例访问。 / p>

  

因此,通过面对这两个定义,我看到了一些相似之处:   ...   3.可以声明为私人

你是对的,两者都可以声明为private,但这两者的私有含义是非常不同的。组合中使用的private表示对该引用的访问仅限于该类。假设您的执行代码中有一个类型为A的objectA。您无法尝试访问objectA.otherObject。 otherObject只能从A的主体引用。当你将内部类声明为private时,这意味着整个类的使用仅限于A的主体。你不能在任何其他地方使用它类。

答案 2 :(得分:0)

阅读关于作文的博客文章让它看起来容易理解.... Composition in JAVA