總述
Java類之間有6種關係,分別是依賴關係(dependence),關聯關係(association),聚合關係(aggregation),組合關係(composition),繼承關係(generalization),實現關係(implementation).他們的耦合度一次遞增,並且聚合關係,組合關係也是關聯關係的一種
代碼的形式介紹6種關係
依賴關係(dependence)
概念: 類A當中使用了類B,其中類B是作爲類A的方法參數、方法中的局部變量、或者靜態方法調用。
代碼演示
Book.java
public class Book {
private String name="《紅樓夢》";
public String getName(){
return this.name;
}
}
People.java
public class People {
// Book作爲read()方法的形參
public void read(Book book){
System.out.println("讀的書是 "+book.getName());
}
}
解釋
依賴關係是類與類之間的聯接,一個類依賴於另一個類的定義.例如,一個人看書,人這個類,依賴於書這個類,如果沒有書,人怎麼有看書這個行爲呢?依賴關係通常是作爲另一個類的局部變量或者方法的參數,或者調用書這個類的靜態方法.
關聯關係(association)
概念: 單向關聯表現爲:類A當中使用了類B,其中類B是作爲類A的成員變量。雙向關聯表現爲:類A當中使用了類B作爲成員變量;同時類B中也使用了類A作爲成員變量。
代碼演示
Son.java
public class Son {
private String name;
Father father=new Father();
public String getName(){
return this.name;
}
public void giveGift(){
System.out.println("送給"+father.getName()+"禮物");
}
}
Father.java
public class Father {
private String name;
Son son = new Son();
public String getName(){
return this.name;
}
public void getGift(){
System.out.println("從"+son.getName()+"獲得禮物");
}
}
解釋
關聯關係使一個類獲得另一個類的屬性和方法.關聯關係可以上單向的,也可以是雙向的.例如:兒子送個父親一個禮物,兒子和父親都需要打印一句話.從兒子的角度,兒子需要知道父親的名字,從父親的角度,父親需要知道兒子的名字,於是就需要在各自的類中實例對方的類,爲得到對方的名字,這樣,兒子和父親都可以訪問對方的屬性和方法了.
聚合關係(aggregation)
概念: 聚合關係是關聯關係的一種,耦合度強於關聯,他們的代碼表現是相同的,僅僅是在語義上有所區別:關聯關係的對象間是相互獨立的,而聚合關係的對象之間存在着包容關係,他們之間是“整體-個體”的相互關係。
代碼演示
Car.java
public class Car {
private String type;
public String getType(){
return this.type;
}
}
House.java
public class House {
private String address;
public String getAddress(){
return this.address;
}
}
People.java
public class People {
Car car;
House house;
// 聚合關係中作爲成員變量的類一般使用set方法賦值
public void setCar(Car car){
this.car = car;
}
public void setHouse(House house){
this.house = house;
}
public void driver(){
System.out.println("車的型號:"+car.getType());
}
public void sleep(){
System.out.println("我在房子裏睡覺:"+house.getAddress());
}
}
解釋
聚合關係是強的關聯關係.它有包含之意,關聯關係的類是在一個平行位置,這是與關聯關係的區別.
組合關係(composition)
概念: 相比於聚合,組合是一種耦合度更強的關聯關係。存在組合關係的類表示“整體-部分”的關聯關係,“整體”負責“部分”的生命週期,他們之間是共生共死的;並且“部分”單獨存在時沒有任何意義。
代碼演示
Body.java
public class Body {
private String name;
public String getName(){
return this.name;
}
}
Soul.java
public class Soul {
private String name;
public String getName(){
return this.name;
}
}
People.java
public class People {
Soul soul;
Body body;
//組合關係中的成員變量一般會在構造方法中賦值
public People(Soul soul, Body body){
this.soul = soul;
this.body = body;
}
public void study(){
System.out.println("學習要用靈魂"+soul.getName());
}
public void eat(){
System.out.println("吃飯用身體:"+body.getName());
}
}
解釋
它也是關聯關係,但是聚合度比聚合關係還要強.組合關係是整體-部分,部分單獨存在沒有意義,需要與整體結合使用.也就是表示整體的這個類負責部分的這些類的生命週期,整體消亡,部分也就不存在了.
繼承關係(generalization)
概念: 類A當中使用了類B,其中類B是作爲類A的方法參數、方法中的局部變量、或者靜態方法調用。
代碼演示
Animal.java
public class Animal {
private void getPrivate(){
System.out.println("private");
}
void getDefault(){
System.out.println("default");
}
protected void getProtected(){
System.out.println("protected");
}
public void getPublic(){
System.out.println("public");
}
}
Dog.java
public class Dog extends Animal{
public static void main(String[] args) {
Dog dog=new Dog();
dog.getDefault();
dog.getProtected();
dog.getPublic();
}
}
輸出結果
default
protected
public
解釋
繼承關係是非常常用的一種關係,使用extends來進行子類繼承父類.子類可以繼承父類的非私有屬性和方法
實現關係(implementation)
概念: 表示一個類實現一個或多個接口的方法。接口定義好操作的集合,由實現類去完成接口的具體操作。在java中使用implements表示。
代碼演示
IPeople.java
public interface IPeople {
public void eat();
}
People.java
public class People implements IPeople{
@Override
public void eat() {
System.out.println("人正在吃飯。。。");
}
}
解釋
實現是指一個類實現一個接口,接口使用interface定義,接口並不是一個類.接口中屬性只有常量,方法是抽象的,只能定義,不能包含方法體,並且屬性和方法都必須是public的(即使不寫方法修改符,也是公共方法),實現類必須使用implements去實現接口的所有方法,可以爲空方法.