Java 多重性是什么

Java 多重性是什么,java,uml,Java,Uml,对于以下Java类,我不确定A和C之间以及B和C之间的多重性是什么 仅供参考:类A和类B可以调用此泛型类C中的部分或所有方法 我猜: A类1---C类* B类1---C类* 如果我错了,请纠正我 还有一件事,1和2的多对多关系是什么时候 class A{ //methods in Class A only involve Ball objects methodA(){ C<Ball> newObj=new C<Ball>();

对于以下Java类,我不确定A和C之间以及B和C之间的多重性是什么

仅供参考:类A和类B可以调用此泛型类C中的部分或所有方法

我猜:

A类1---C类* B类1---C类* 如果我错了,请纠正我

还有一件事,1和2的多对多关系是什么时候

class A{
    //methods in Class A only involve Ball objects
    methodA(){
        C<Ball> newObj=new C<Ball>();
        newObj.method1();
    }
}

class B{
    //methods in Class B only involve Tennis objects
    methodB(){
        C<Tennis> newObj=new C<Tennis>();
        newObj.method1();
    }
}

class C<T>{
    method1(){
        //implementation here
    }
    method2(){
        //implementation here
    }
    method3(){
        //implementation here
    }
}

多重性提供有关可以创建多少特定类型的实例、属性值或要链接的已连接实例的信息。它与操作调用无关。 例如,如果关联端的多重性为[0..*],则意味着对于连接到关联另一端的一个实例,可以连接零个或多个实例


A-C[0..*]=A的一个实例连接了从零到无限的C实例。

多重性提供了有关可以创建多少特定类型、属性值或连接到链接的实例的信息。它与操作调用无关。 例如,如果关联端的多重性为[0..*],则意味着对于连接到关联另一端的一个实例,可以连接零个或多个实例


A-C[0..*]=A的一个实例连接了从零到无限的C实例。

通常您会问,Y的一个实例可以存在多少个不同的X实例,反之亦然?在您的示例中,在类图上下文中谈论多重性并不完全有意义,原因有二:

您的C不保留对任何关联a或B的引用。因此,充其量,这是一种单向关系。当谈到多重性时,这是可以的,尽管在你的例子中,多重性是没有意义的,参见第2点。就多重性而言,忽略点2,A正好有1个C,B正好有1个C,C有0个A和0个B

您的关系是局部变量的形式。因此,它不是真正的类级关系。一旦A或B的方法返回,这种关系就会消失。因此,为这些类建立一个关联图并不一定有意义。可能是调用方/被调用方图,但不是一般关联

在您的示例中,A在其某些方法中本地使用C,这是一个依赖关系的示例,而不是关联。UML通常使用虚线表示,尽管某些风格可能有所不同,但多样性并没有为此发挥作用,因为质量差:

您的示例中有几个小的更改,可以使多重性变得相关。例如,保持C不变,但将A更改为:

class A {
   C<Ball> c = new C<Ball>();
   ...
   methodA(){
       c.method1();
   }
}
在这种情况下,A正好有一个C,C有零个A,这是单向的。UML看起来又像了,很抱歉质量问题:

也就是说,如果您进行上述更改,它将成为零对一关系。它是单向的,因为C不知道A

还有一件事,1和2的多对多关系是什么时候

class A{
    //methods in Class A only involve Ball objects
    methodA(){
        C<Ball> newObj=new C<Ball>();
        newObj.method1();
    }
}

class B{
    //methods in Class B only involve Tennis objects
    methodB(){
        C<Tennis> newObj=new C<Tennis>();
        newObj.method1();
    }
}

class C<T>{
    method1(){
        //implementation here
    }
    method2(){
        //implementation here
    }
    method3(){
        //implementation here
    }
}
当a存储链接到多个C,而C存储链接到多个a时,这是一种多对多关系。例如,学生在大学里学习课程。每门课程包含多个学生,每个学生都参加多个课程。例如:

class Student {
    Collection<Course> courses;
}

class Course {
    Collection<Student> students;
}

通常,您会问,对于Y的单个实例,X可以存在多少个不同的实例,反之亦然?在您的示例中,在类图上下文中谈论多重性并不完全有意义,原因有二:

您的C不保留对任何关联a或B的引用。因此,充其量,这是一种单向关系。当谈到多重性时,这是可以的,尽管在你的例子中,多重性是没有意义的,参见第2点。就多重性而言,忽略点2,A正好有1个C,B正好有1个C,C有0个A和0个B

您的关系是局部变量的形式。因此,它不是真正的类级关系。一旦A或B的方法返回,这种关系就会消失。因此,为这些类建立一个关联图并不一定有意义。可能是调用方/被调用方图,但不是一般关联

在您的示例中,A在其某些方法中本地使用C,这是一个依赖关系的示例,而不是关联。UML通常使用虚线表示,尽管某些风格可能有所不同,但多样性并没有为此发挥作用,因为质量差:

您的示例中有几个小的更改,可以使多重性变得相关。例如,保持C不变,但将A更改为:

class A {
   C<Ball> c = new C<Ball>();
   ...
   methodA(){
       c.method1();
   }
}
在这种情况下,A正好有一个C,C有零个A,这是单向的。UML看起来又像了,很抱歉质量问题:

也就是说,如果你做了上面的改变,它就会变成一个零对一的关系 P它是单向的,因为C不知道A

还有一件事,1和2的多对多关系是什么时候

class A{
    //methods in Class A only involve Ball objects
    methodA(){
        C<Ball> newObj=new C<Ball>();
        newObj.method1();
    }
}

class B{
    //methods in Class B only involve Tennis objects
    methodB(){
        C<Tennis> newObj=new C<Tennis>();
        newObj.method1();
    }
}

class C<T>{
    method1(){
        //implementation here
    }
    method2(){
        //implementation here
    }
    method3(){
        //implementation here
    }
}
当a存储链接到多个C,而C存储链接到多个a时,这是一种多对多关系。例如,学生在大学里学习课程。每门课程包含多个学生,每个学生都参加多个课程。例如:

class Student {
    Collection<Course> courses;
}

class Course {
    Collection<Student> students;
}


所以,如果类A或类B中的每个方法都有一个类C的实例,那么它就是一个C[1..*]?如果说只有一些类A/B的方法有类C的实例,那么它就是C[0..*]?这是一个如何理解多重性的例子。方法并没有实例,因为定义方法的多重性并没有意义。参数中只有方法操作中的多重性定义。@user614454不,这不太正确。A/B的各个方法是否有C类的本地实例与多重性无关。多样性描述了类级关系;i、 e.A的实例在其整个生命周期中保持零个、一个或多个指向C实例的链接。因此,如果类A或类B中的每个方法都有一个类C的实例,那么它就是C[1..*]?如果说只有类A/B的一些方法有类C的实例,那么它就是C[0..*]?这是一个如何理解多重性的示例。方法并没有实例,因为定义方法的多重性并没有意义。参数中只有方法操作中的多重性定义。@user614454不,这不太正确。A/B的各个方法是否有C类的本地实例与多重性无关。多样性描述了类级关系;i、 一个A的实例在其整个生命周期中保持着与一个C实例的零、一或多个链接。参见UML上层建筑,章节类。您需要知道一些细节。请参阅UML上层结构,章节类。有一些细节你需要知道。对于单向的,我看到一些网站使用与你的箭头相同的虚线箭头。它的意思与上面的图表相同吗?@user614454不,通常不是。虚线通常表示可以是单向的依赖关系,通常是但不是关联,而不是类级关系。虚线对于您的原始示例更准确,因为A依赖于C,即使它不与C保持关联。我将更新我的答案,以包括这一点,因为它是相关的。根据您的解释,如果我不知道C类的实例数,是否正确。在依赖于用户输入的情况下,我从未在代码的属性部分前面声明过,如您所示……这是否意味着我应该使用虚线版本???@user614454用户输入是不相关的。即使你不知道会有多少个实例,如果可以有多个实例,那就是多个。但是,使用虚线版本并不是因为用户输入或其他原因,而是因为没有实际维护链接,只是在方法中有一个本地实例。简化规则:如果您的成员字段只是普通引用类型,那么它就是一个。如果它是一个集合,那么它是很多的。如果根本没有成员字段,则为零或不是关联。您在方法中对局部变量所做的操作与此无关。@JasonC:请注意,您在上面的digram中用于关联行的可导航性箭头已过时。UML2.5建议使用点来表示引用属性,如::CinYou示例,正如在“单向”中所解释的,我见过一些网站使用与您的箭头相同的虚线箭头。它的意思与上面的图表相同吗?@user614454不,通常不是。虚线通常表示可以是单向的依赖关系,通常是但不是关联,而不是类级关系。虚线对于您的原始示例更准确,因为A依赖于C,即使它不与C保持关联。我将更新我的答案,以包括这一点,因为它是相关的。根据您的解释,如果我不知道C类的实例数,是否正确。在依赖于用户输入的情况下,我从未在代码的属性部分前面声明过,如您所示……这是否意味着我应该使用虚线版本???@user614454用户输入是不相关的。即使你不知道会有多少个实例,如果可以有多个实例,那就是多个。但是,使用虚线版本并不是因为用户输入或其他原因,而是因为没有实际维护链接,只是在方法中有一个本地实例。简化规则:如果您的成员字段只是普通引用类型,那么它就是一个。如果它是一个集合,那么它是很多的。如果根本没有成员字段,则为零或不是关联。在方法中处理局部变量的方法是IREL
evant@JasonC:请注意,您在上面的digram中用于关联行的导航性箭头已过时。UML2.5建议在示例中使用点来表示引用属性,如中所述