java類和類之間的關係

java類和類之間的關係

概覽

5種關係

  1. 依賴(dependency)
  2. 關聯(association)
  3. 聚合(aggregation)
  4. 組合(composition)
  5. 繼承(inheritance)可以更加細得分爲實現(realization)和泛化(generalization)

從上至下依賴關係逐漸增強

詳細說明區別

其實依賴關聯聚合組合 都是差不多的,在日常的表達中也很容易混爲一談,特別是聚合和組合更加容易混爲一談(我感覺也沒必要區分這麼細,都是 “我中有你”)。

詳細的含義如下

  1. 依賴:單向,類A依賴類B,是A在局部變量、方法入參、靜態調用中出現了B(我覺得方法出參中出現B應該也算依賴),類似 use a
  2. 關聯:可以單向雙向(避免雙向,它是一種循環依賴),類之間是一種比較平等的關係。類似 has a
  3. 聚合:是特殊的關聯,跟關聯的區別僅僅是語義上,比如關聯的兩個類的關係比較平等,但是聚合是不平等的,聚合是整體和個體的區別。對象的生命週期是 “整體死了,但是個體還在”(詳細看代碼以加深印象)
  4. 組合:是特殊的聚合,也僅僅是語義的差別。聚合是 “整體死了,個體還在”,組合是 “整體死了,個體也死了”,個體是整體的組成部分(詳細看代碼以加深印象)
  5. 繼承:就是類繼承類,類繼承抽象類,類實現接口,接口繼承接口這些關係。跟上面4個很好區分。其中也可以再細分爲實現泛化,實現就是類實現接口,泛化就是類繼承類、類繼承抽象類、接口繼承接口。泛化是一種 is a

用代碼說明區別

  • 依賴
// use a
// 方法入參的依賴
public class Person {
  public void drink(Water w) {
  }
}
// 局部變量的依賴
public class Person {
  public void goOut() {
  	Car car = new Car();
  }
}
// 靜態調用的依賴
public class Person {
  public void born() {
  	String idCardNo = IdCardUtil.getIdCardNo();
  }
}
// 方法出參的依賴
public class Person {
  public Profile getProfile() {
	
	}
}
  • 關聯(是一種平等的關係),表示has a(有一個),比如這裏的 “人有一個手機”
// has a
public class Person {
	private Phone phone;
	public void setPhone(Phone phone) {
		this.phone = phone;
	}
	public Phone getPhone() {
		return this.phone;
	}
}
  • 聚合:整體死了個體還沒死
// Team被JVM回收時,persons不被回收,個體還存在
public class Team {
	private List<Person> persons;
	public Team(List<Person> persons) {
		this.persons = persons;
	}
}
  • 組合:整體死了,個體也死,個體是整體的組成部分
// Person被JVM回收後,各部分也被回收
public class Person {
	private Head head;
	private Body body;
	private List<Arm> arms;
	private List<Leg> legs;
	
	public Person() {
		this.head = new Head();
		this.body = new Body();
		this.arms = Lists.newArrayList<Arm>(new Arm("左臂"), new Arm("右臂"));
		this.legs = Lists.newArrayList<Leg>(new Leg("左腿"), new Leg("右腿"));
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章