前言
在开发过程中,我们遇到的很多问题不是某一个对象单独能够解决的,可能是由多个不同类型的对象协作完成的,那么我们就需要在复杂的问题域中去找它们的关联(主要有三种对象的关联关系),让它们能够合作。
一、has - a 关系
1.概念
- 在一个对象的内部 “拥有” 另一个对象
has-a 关联关系就是把一个对象 设计为 另外一个对象的属性(全局变量)
- 此时 关联分为 单向关联 和 双向关联
- 单向:A里有个 B 或者 B里有个 A
- 双:A里有个 B 并且 B里有个 A (相互包含)
- 把对方 设计为自己的属后,有个特点,两个对象的生命周期保持一致,在当前对象的所有方法中,可以访问到关联对象。
2.代码理解
场景:主人给猫喂食 猫就给撸给抱
一、
public class Master {
//属性
public String name; //姓名
//修饰符 类名 变量名
public Cat cat; //主人有猫 has关系
//行为
public void giveFood(){ //全局变量
//喂猫
System.out.println(name+"给"+cat.name+"喂食");
}
}
二、
public class Cat {
//属性
public String name;
//此时 主人作为猫的属性
public Master master;
//行为
public void eat(){//主人喂食 给撸给抱
System.out.println("给"+master.name+"撸、抱");
}
}
三、
public class Main {
public static void main(String[] args) {
//生成对象
Master master =new Master();
Cat cat=new Cat();
//赋值
master.name="江小白";
cat.name="毛孩子";
//建立关系 cat和master的联系
master.cat=cat;
cat.master=master;
//操作对象
//主人对象 调用giveFood方法 全局变量
master.giveFood();
master.cat.eat();
}
}
二、use - a 关系
1.概念
- 在一个对象的某个方法中 “使用” 另一个对象
use - a 依赖关系就是把一个对象 设计为 另外一个对象的某个方法的局部变量;
- 该局部变量可以通过 参数传递 这个方法,其实也可以在方法内部去new一个。
- 上述两种方式都是use-a关系。因为不管是 参数传递还是方法内部声明定义,都是方法局部变量,方法结束,局部变量消失,关系就会解除。
2.代码理解
一、
public class Master {
//属性 只有自己的名字 没有猫
public String name; //姓名
//喂养流浪猫 行为 (方法重载)
public void giveFood(Cat cat2){//局部变量
System.out.println(this.name+"喂养"+cat2.name+"猫粮");
//喂完后 给回应 (放在方法里,方法结束,局部变量消失,关系就会解除)
cat2.eat();
}
}
二、
public class Cat {
//属性 猫自己的名字
public String name;
//行为
public void eat() {
//流浪猫没有主人 相当于master为null
System.out.println("流浪猫感动的留下了热泪..");
}
}
三、
public class Main {
public static void main(String[] args) {
//喂养流浪猫
//生成对象
Master master=new Master();
Cat cat2=new Cat();
//赋值
master.name="江小白";
cat2.name="流浪猫";
//主人对象 调用giveFood方法(行为) 局部变量 实参cat2(流浪猫)
master.giveFood(cat2);
}
}
三、is - a 关系
指一个对象是另外一种对象的特例