類之間的6種關係

總述

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去實現接口的所有方法,可以爲空方法.

發佈了35 篇原創文章 · 獲贊 8 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章