Java 组合与内部类

Java 组合与内部类,java,inner-classes,composition,Java,Inner Classes,Composition,作文和内部课堂有什么区别和相似之处? 我试图学习Java的原理,并试图弄清楚整个图像。对我来说,最好是进行类比,看看概念之间的异同,以便正确地使用它们 构成的定义: “组合是在类中实现has-a关系的设计技术”。 “Java合成是通过使用引用其他对象的实例变量来实现的” 内部类(或成员类,非匿名)的定义: 成员类也定义为封闭类的成员,但不使用静态修饰符声明。这种类型的内部类类似于实例方法或字段。成员类的实例始终与封闭类的实例相关联,成员类的代码可以访问所有字段和方法 因此,面对这两个定义,我看到

作文和内部课堂有什么区别和相似之处? 我试图学习Java的原理,并试图弄清楚整个图像。对我来说,最好是进行类比,看看概念之间的异同,以便正确地使用它们

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

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

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

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

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

您是对的,组合类和内部类都实现了“has-a”方案,但它们有很多不同之处

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

在这种情况下,otherObject只是对类型B的另一个对象的实例的引用。otherObject可以独立于a的实例而存在,并且a的多个实例可以引用同一个B

内部类是指类定义实际上包含在外部类中

public class C {
    class D {
        /* Inner class stuff goes here */
    }
}
这主要用于逻辑分组。在这种情况下,D与C直接关联,而B可能是也可能不是a的逻辑子级。在C之外访问D变得稍微复杂一些,但只能通过C的现有实例访问它

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


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

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

  • 是由内部类组成的类成员
  • B是由外部类的实例组成的类成员
例如:

class Driver {
}

class Car {

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

    //B
    Driver driver;

    int gasLevel;

}
也就是说:

  • A是一个领域
  • B是一个字段
  • A是一个内部类
  • B不是一个内部类
  • A可以访问车辆内部状态(气体液位)
  • B无法访问车辆内部状态(气体水平)
  • 如果没有汽车的实例,引擎是不存在的
  • 司机的存在没有汽车的实例

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

阅读这篇关于组合的博客文章似乎很容易理解。。。。

这是苹果和橙子的比较。你必须有一些共同点来比较两件事。这就像比较洗衣机和火车,因为两者都有发动机。你应该阅读展示这两个概念用法的例子,看看它们是否都可以用于解决同一领域的问题。但是你是基于什么原因来比较它们的呢?例如,你可以说:“为了解决问题X,我可以使用这个解决方案,或者那个解决方案,这两个解决方案是相似的,它们都解决了问题X,也许在其他方面也一样,但它们在方面A、B和C是不同的。”。但你从一个共同点开始:解决问题X的需要。@realponsibilist,如果我必须在面试中回答这样一个问题,我可以引用你的话吗?:)你可以,尽管我怀疑我的昵称在面试中会给任何人留下深刻印象。。。但是请记住,面试问题并不总是用来测试你的知识,而是用来测试你思考问题的方式。所以也许他们希望你们认识到并没有共同点,就这么说吧。@realponstitor,如果我发现概念之间有一些相似之处,对我来说是一个共同点。也许你说的是不同的目的,这就是为什么我不愿意听你解释的原因。但在您的情况下,B不应该是一个关联(或聚合)?组成:A由B组成;B是a的一部分,因此没有a就不能存在(a拥有B);在你的情况下,司机的存在没有汽车的实例。对我来说,这只是一种联想的形式(或者更好的联想):联想:a使用B,a与B以特定的方式关联。我同意,我的回答对“构成”这个词并不严格准确。然而,你最初对构图的定义也不精确。准确地说,我们需要称B为聚合。组合和聚合都是关联。我们可以将A组合和B称为聚合。嘿,当
驱动程序
需要知道
气体液位
时,您将如何处理这种情况?将
Car
参考放在
Driver
类中是否可以?是的,同时在Car上添加一个setter以显示气体液位值。请注意,此示例不是关于对象建模的最佳实践。请始终从答案中的链接中添加相关位,最好是在总结/解释后添加,以适合所问的问题。在本说明中,您将合成与聚合混淆了。当o的对象
class Driver {
}

class Car {

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

    //B
    Driver driver;

    int gasLevel;

}