📅  最后修改于: 2020-03-19 05:53:22             🧑  作者: Mango
关联是通过对象建立的, 两个单独类之间的关系。关联可以是一对一,一对多,多对一,多对多。
在面向对象的编程中,一个对象与其他对象进行通信以使用该对象提供的功能和服务。组合和聚合是关联的两种形式。
// Java展示关联
import java.io.*;
// class bank
class Bank
{
private String name;
// bank名称
Bank(String name)
{
this.name = name;
}
public String getBankName()
{
return this.name;
}
}
// employee类
class Employee
{
private String name;
// employee名称
Employee(String name)
{
this.name = name;
}
public String getEmployeeName()
{
return this.name;
}
}
// 关联两个类
class Association
{
public static void main (String[] args)
{
Bank bank = new Bank("高盛");
Employee emp = new Employee("小兰");
System.out.println(emp.getEmployeeName() +
" 被雇于 " + bank.getBankName());
}
}
输出:
小兰 被雇于 高盛
在上面的示例中,两个单独的类:Bank和Employee通过其对象关联。银行可以有很多员工,所以这是一对多的关系。
聚合
这是一种特殊的关联形式,其中:
// Java展示关联.
import java.io.*;
import java.util.*;
// student class
class Student
{
String name;
int id ;
String dept;
Student(String name, int id, String dept)
{
this.name = name;
this.id = id;
this.dept = dept;
}
}
// 部门类,包含不同学生
class Department
{
String name;
private List students;
Department(String name, List students)
{
this.name = name;
this.students = students;
}
public List getStudents()
{
return students;
}
}
// 学院类,包含不同部门
class Institute
{
String instituteName;
private List departments;
Institute(String instituteName, List departments)
{
this.instituteName = instituteName;
this.departments = departments;
}
// 计算所有部门中的所有学生
public int getTotalStudentsInInstitute()
{
int noOfStudents = 0;
List students;
for(Department dept : departments)
{
students = dept.getStudents();
for(Student s : students)
{
noOfStudents++;
}
}
return noOfStudents;
}
}
// main函数
class GFG
{
public static void main (String[] args)
{
Student s1 = new Student("Mia", 1, "CSE");
Student s2 = new Student("Priya", 2, "CSE");
Student s3 = new Student("John", 1, "EE");
Student s4 = new Student("Rahul", 2, "EE");
// 制造一个List的学生,专业ces
List cse_students = new ArrayList();
cse_students.add(s1);
cse_students.add(s2);
// 制造一个List的学生,专业ee
List ee_students = new ArrayList();
ee_students.add(s3);
ee_students.add(s4);
Department CSE = new Department("CSE", cse_students);
Department EE = new Department("EE", ee_students);
List departments = new ArrayList();
departments.add(CSE);
departments.add(EE);
// 创建一个Institute实例
Institute institute = new Institute("BITS", departments);
System.out.print("所有系的学生数量: ");
System.out.print(institute.getTotalStudentsInInstitute());
}
}
输出:
所有系的学生数量: 4
在此示例中,我们创建一个Institute类,该类引用了Object或没有学生。部门类的对象(即对象列表)。这意味着学院类通过其对象与部门类相关联。并且部门类还引用了Student类的一个或多个对象(即对象列表),这意味着它通过其Object与Student类相关联。
它代表一种Has-A关系。
什么时候使用聚合?
最好通过聚合来实现代码重用。
组合
组合是聚合的一种受限形式,其中两个实体相互高度依赖。
让我们以图书馆为例
// Java展示组合
import java.io.*;
import java.util.*;
// class book
class Book
{
public String title;
public String author;
Book(String title, String author)
{
this.title = title;
this.author = author;
}
}
// Libary类,包含书的List
class Library
{
// 书List.
private final List books;
Library (List books)
{
this.books = books;
}
public List getTotalBooksInLibrary(){
return books;
}
}
// main方法
class GFG
{
public static void main (String[] args)
{
// 生成一些列书的Object.
Book b1 = new Book("芒果文档-Java", "mango");
Book b2 = new Book("芒果文档-Java变量", "mango boy");
Book b3 = new Book("芒果文档-Java继承", "mango girl");
// 创建书的List.
List books = new ArrayList();
books.add(b1);
books.add(b2);
books.add(b3);
Library library = new Library(books);
List bks = library.getTotalBooksInLibrary();
for(Book bk : bks){
System.out.println("书名 : " + bk.title + " and "
+" 作者 : " + bk.author);
}
}
}
输出
书名 : 芒果文档-Java : mango
书名 : 芒果文档-Java变量 : mango boy
书名 : 芒果文档-Java继承 : mango girl
在上面的示例中,一个库可以没有。同一主题或不同主题的书籍。因此,如果图书馆被销毁,则该特定图书馆中的所有图书都会被销毁。即书没有图书馆就不可能存在。这就是为什么它是组成。
组合和聚合
// Java代码,展示组合和聚合的关系
import java.io.*;
// Engine类
class Engine
{
// 启动引擎.
public void work()
{
System.out.println("车的引擎被启动 ");
}
}
// Engine类
final class Car
{
private final Engine engine; // 聚合
//private Engine engine; // 组合
Car(Engine engine)
{
this.engine = engine;
}
// 开启引擎
public void move()
{
//if(engine != null)
{
engine.work();
System.out.println("车在动 ");
}
}
}
class GFG
{
public static void main (String[] args)
{
// 创造engine实例
Engine engine = new Engine();
Car car = new Car(engine);
car.move();
}
}
输出:
车的引擎被启动
车在动