Java 聚合

聚合是两个类 其中一个类包含另一个类的实例。例如,当对象 A 包含对另一个对象 B 的引用时,或者我们可以说对象 A 与对象 B 具有 HAS-A 关系时,则在 Java 编程中将其称为聚合。

Java 的使用聚合

Java 中的聚合有助于重用代码。对象 B 可以具有实用方法,并且可以被多个对象使用。无论哪个类拥有对象 B,它都可以利用它的方法。

Java 聚合示例

示例 1

在这个例子中,我们创建了一些类,比如Vehicle,Speed。定义了一个Van类,它扩展了Vehicle类并具有Speed类对象。Van类继承了Vehicle类的属性,Speed是它的属性,我们从调用者对象传递它。在输出中,我们打印Van对象的详细信息。

package com.yxjc123;

class Vehicle{
   private String vin;

   public String getVin() {
      return vin;
   }

   public void setVin(String vin) {
      this.vin = vin;
   }	
}
class Speed{
   private double max;

   public double getMax() {
      return max;
   }

   public void setMax(double max) {
      this.max = max;
   }
}

class Van extends Vehicle {
   private Speed speed;

   public Speed getSpeed() {
      return speed;
   }

   public void setSpeed(Speed speed) {
      this.speed = speed;
   }

   public void print() {
      System.out.println("Vin: " +this.getVin() + ", Max Speed: " + speed.getMax() );
   }
} 

public class Tester {

   public static void main(String[] args) {
      Speed speed = new Speed();
      speed.setMax(120);
      Van van = new Van();

      van.setVin("abcd1233");
      van.setSpeed(speed);
      van.print();
   }
} 

输出

Vin: abcd1233, Max Speed: 120.0 

示例 2

在这个示例中,我们创建了几个类,例如Student,Address。学生可以有一个地址。因此,我们在 Student 类中定义了一个地址作为实例变量。在输出中,我们打印学生详细信息。

package com.yxjc123;

class Address {
   int strNum;
   String city;
   String state;
   String country;

   Address(int street, String c, String st, String country) {
      this.strNum = street;
      this.city = c;
      this.state = st;
      this.country = country;
   }
}
class Student {
   int rno;
   String stName;

   Address stAddr;
   Student(int roll, String name, Address address){
      this.rno = roll;
      this.stName = name;
      this.stAddr = address;
   }
}

public class Tester {

   public static void main(String[] args) {
      Address ad= new Address(10, "Bareilly", "UP", "India");
      Student st= new Student(1, "Aashi", ad);
      System.out.println("Roll no: "+ st.rno);
      System.out.println("Name: "+ st.stName);
      System.out.println("Street: "+ st.stAddr.strNum);
      System.out.println("City: "+ st.stAddr.city);
      System.out.println("State: "+ st.stAddr.state);
      System.out.println("Country: "+ st.stAddr.country);
   }
} 

输出

Roll no: 1
Name: Aashi
Street: 10
City: Bareilly
State: UP
Country: India 

从独特的意义上来说,这是一种关联类型。聚合是一种单向定向关系,它精确地表达了类之间的 HAS-A 关系。此外,当两个类聚合时,终止其中一个类不会对另一个类产生影响。与组合相比,它经常被指定为弱关系。相比之下,父实体拥有子实体,这意味着子实体不能直接访问,也不能离开父对象而存在。相反,在关联中,父实体和子实体可以各自存在。

HAS-A 关系

这些关系主要基于用法。这决定了某个类是否HAS-A某个东西。这种关系有助于减少代码重复和错误。

示例

public class Vehicle{}
public class Speed{}

public class Van extends Vehicle {
   private Speed sp;
} 

这表明该类 Van 具有 A 速度。通过为 Speed 建立一个单独的类,我们不必将属于 speed 的整个代码放入 Van 类中,这使得在多个应用程序中重用 Speed 类成为可能。

在面向对象中功能,用户无需关心哪个对象正在做真正的工作。为了实现这一点,Van 类向 Van 类的用户隐藏了实现细节。因此,基本上发生的情况是用户会要求 Van 类执行某个操作,而 Van 类将自行完成该工作或要求另一个类执行该操作。