组合是一种关联类型,用于表示两个对象之间的“PART-OF”关系。 java中的组合是另一种关联聚合的受限形式,其中“Has-a”关系中的两个实体有自己的存在并且彼此不依赖。在组合中,一个实体包含在其他实体中,不能单独存在。与用于表示 is-a 关系的继承不同。
例如有两个类Car和Engine,Car是由一个引擎对象组成的,没有Car就不存在引擎实体。
开始您的免费软件开发课程
网络开发、编程语言、软件测试及其他
语法:
class C1{ // A class represents the dependent entity } class C2{ //This class represents the entity that contains the dependent entity by declaring the object of the above class as one of its member variables. private C1 a; }
使用上述语法,我们能够在上述两个实体之间建立“isPart-Of”关系,其中 C1 依赖于另一个实体的存在。另外,可以说明依赖对象的存在是可选的。
当使用继承来表示 2 个实体时,我们可以看到,只能存在 IS-A 关系。但如果两个实体之间包含有关系,则需要聚合。聚合有 2 种不同类型:
这用于表示两个实体以 HAS-A 关系存在,但其中一个实体的存在不依赖于其他实体的关系。而且,它是一种单向类型的关联。例如,银行和员工是两个实体,其中银行的单个实体可以与多个员工相关;因此,银行与员工之间存在一对多关系,但反之亦然。
这是当两个实体之一在另一个容器实体中组成时使用的限制性关联类型。如果没有容器对象,组合实体就无法存在。但可以有一个空的组合实体。因此它被用来表示双向的PART-OF关系;因此,两个实体相互依赖。
由于组合用于实现两个实体之间的 PART-OF 类型关系,因此一个实体被称为容器,另一个实体被称为组合实体。 组合实体就像一个完整的容器对象,有自己的属性和操作,从而为它制作一个单独的实体。这也有助于代码重用,因为此类可以作为组合实体在其他容器类中使用。例如,Engine 是一个组合类,Car、TwooWheeler 等可以是它的容器类。
由于组合类是容器实体的一部分,因此两者相互依赖。但是,组合类仍然可以为空,比如汽车不需要强制具有引擎。这样,组合类就完全依赖于容器类的存在。另外,由于组合是类型关联,因此 PART-OF 关系也被称为 HAS-A 关系的子类。这样,组合有助于在不使用继承的情况下实现两个相互依赖的实体之间的关系。
考虑由不同列表(例如办公桌、会议室)组成的办公室的情况。桌面对象进一步由电话对象组成,因为每张桌子都有一部桌面电话。
代码:
package Try; public class Phone { private String Model; private String contactNum; Phone (String model, String num){ this.Model=model; this.contactNum=num; } public void getPhoneDetails(){ System.out.println("Phone Model "+ this.Model); System.out.println("Desk Number " + this.contactNum); } }
代码:
package Try; public class Desk { private String id; private String Mid; private Phone deskNum; private String personName; Desk(String id,String mid,Phone contact,String name){ this.id=id; this.Mid = mid; this.deskNum=contact; this.personName=name; } public void getDeskDetails(){ System.out.println("Desk Details :-"); System.out.println("Id " + this.id); System.out.println("Machine ID "+ this.Mid); System.out.println("Allocated To " + this.personName); this.deskNum.getPhoneDetails(); } }
代码:
package Try; public class MeetingRoom { private String name; private Phone contact; private String location; private int numChairs; private int numTables; MeetingRoom(String name,Phone contact,String location,int nChairs, int nTables){ this.name=name; this.contact=contact; this.location=location; this.numChairs=nChairs; this.numTables=nTables; } public void getMeetingRoomDetails(){ System.out.println("Meeting Room Details :-"); System.out.println("Name " +this.name); System.out.println("Location "+ this.location); System.out.println("Number OF Chairs " + this.numChairs); System.out.println("Number OF Tables "+this.numTables); contact.getPhoneDetails(); } }
代码:
package Try; import java.util.List; public class Office { private String offcName; private List<Desk> deskList; private List<MeetingRoom> roomList; private int pantryNum; public Office(String name , List<Desk> dList, List<MeetingRoom> mList,int pnum){ this.offcName = name; this.deskList = dList; this.roomList = mList; this.pantryNum =pnum; } public void getDetails(){ System.out.println("Below are details of "+ offcName +"Office"); for(Desk a:deskList){ a.getDeskDetails(); } for(MeetingRoom m:roomList){ m.getMeetingRoomDetails(); } System.out.println("Number Of pantry " + pantryNum ); } }
代码:
package Try; import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import java.util.ArrayList; import java.util.List; public class Demo extends Frame { public static void main(String[] args){ List<Desk> dList =new ArrayList<Desk>(); List<MeetingRoom> mList =new ArrayList<MeetingRoom>(); Phone p1=new Phone("NOTOROLA","12346"); Phone p2=new Phone("NOTOROLA","35235"); Phone p3=new Phone("BSNL","23233"); Phone p4=new Phone("BSNL","123346"); Desk d1 =new Desk("S121","M12",p1,"Tom"); Desk d2 =new Desk("S122","M14",p2,"Pam"); dList.add(d1); dList.add(d2); MeetingRoom m1=new MeetingRoom("Kurukshetra",p3,"Floor_10",10, 2); MeetingRoom m2=new MeetingRoom("Karnal",p4,"Floor_9",20, 3); mList.add(m1); mList.add(m2); Office o1= new Office("Banglore" , dList, mList,20); o1.getDetails(); } }
输出:
说明: 在上面的程序中,Office 对象由 Desks 和 Meeting Room 实体列表组成,其中 Desk 和 Meeting room 又由 Phone 实体组成。在这里,电话始终与办公桌或会议室对象相关,因此不存在。此外,会议室和办公桌还依赖于 Office 对象。这里的 Single Phone 类可以用作办公桌和会议室中的组合实体,从而有助于实现代码的可重用性。
它是一种限制性聚合类型,用于实现具有双向关系的两个实体之间的 PART-OF 关系,并且具有在没有容器实体的情况下不存在的组合实体。这是有益的,因为在组合类中所做的任何更改都不会影响其余代码和代码重用。
以上是Java 中的组合的详细内容。更多信息请关注PHP中文网其他相关文章!