Javaクラスとクラスの間には多くの関係があり、継承(一般化)、関連付け、および依存関係に分けることができます。その中で、関連関係は、組み合わせ関係と集約関係に細分することができます。
一般化
つまり、継承関係、つまりis-a関係があり、extendsキーワードはJavaで一般的に使用されます。
例えば:
class animal{
}
//实现类的继承
public class cat extends animal{
}
Javaでの継承はコードの再利用を実現できますが、継承はカプセル化を破り、コードの結合を改善するため、コードの再利用の最良の形式ではありません。上位クラスの実装は、リリースバージョンによって変更される場合があります(たとえば、新しいメソッドが追加されます)。このとき、下位クラスのコードが変更されていなくても、下位層が「壊れている」可能性があります。
頼る
依存性(依存性)関係は、クラス間の接続です。依存関係とは、あるクラスが別のクラスの定義に依存していることを意味します。たとえば、人(Person)は車(car)と家(House)を購入できます。PersonクラスはCar and Houseを参照するため、PersonクラスはCarクラスとHouseクラスの定義に依存します。関連付けとは異なり、PersonクラスにはCarタイプとHouseタイプの属性はありません。CarとHouseのインスタンスは、パラメーターの形式でbuy()メソッドに渡されます。一般的に、依存関係は、ローカル変数、メソッドの正式なパラメーター、または静的メソッドの呼び出しとしてJava言語で具体化されます。
class Car{
public static void run(){
}
}
class Driver{
//使用形参方式发生依赖关系
public void drive1(Car car){
car.run();
}
//使用局部变量发生依赖关系
public void drive2(){
Car car=new Car();
car.run();
}
//使用静态变量发生依赖关系
public void drive3(){
car.run();
}
}
依存関係は最も弱い関係です。上記の例では、DriverクラスはCarクラスに依存しています。
仲間、同僚
アソシエーション(アソシエーション)関係は、クラスとクラスの間の接続であり、あるクラスに別のクラスのプロパティとメソッドを認識させます。関連付けは、双方向または単方向にすることができます。Java言語では、関連付け関係は通常、メンバー変数を使用して実装されます。
class Driver{
Car mycar;
//使用成员变量形式实现关联
public void drive(){
mycar.run();
}
}
連想は依存よりも強い関係です。
重合
集約関係は一種の関連関係であり、強い関連関係です。集約とは、全体と個人の間の関係です。たとえば、会社のカテゴリと従業員のカテゴリ。アソシエーション関係と同様に、集約関係もインスタンス変数を介して実現されます。ただし、関連付け関係に関係する2つのクラスは同じレベルにあり、集約関係では、2つのクラスは等しくないレベルにあり、一方は全体を表し、もう一方は部分を表します。集約はhas-a関係です。
集計は空にすることができます。それでも会社タイプと従業員タイプです。会社に従業員がいない場合でも、それは会社であり、単なるペーパーカンパニーです。全体と組み合わせの一部の関係と比較すると、集合は「唇と歯の冷たさ、生と死を一緒に」という関係を持たない一種の関係です。
class Driver {
//使用成员变量形式实现聚合关系
Car mycar;
public void drive(){
mycar.run();
}
}
集計関係は通常、セッターメソッドを使用してメンバー変数に値を割り当てます。
組み合わせ
構成関係は一種の関連関係であり、集約関係よりも強力です。通常の集約関係で全体を表すオブジェクトは、一部のオブジェクトのライフサイクルを表す責任があり、構成関係を共有することはできません。全体を表すオブジェクトは、オブジェクトの一部を維持し、存続させる責任があり、場合によっては、その部分を表すオブジェクトを消滅させる必要があります。全体を表すオブジェクトは、パーツを表すオブジェクトを、このオブジェクトのライフサイクルを担当する別のオブジェクトに渡すことができます。つまり、オブジェクトの代表的な部分は、一度に1つのオブジェクトとしか組み合わせることができず、後者はライフサイクルを独占的に担当します。部分と全体のライフサイクルは同じです。
class Driver{
Car mycar;
public Driver(Car car){
mycar = car;
}
}
組み合わせ関係は、初期化の目的を達成するために構築方法を使用する可能性が高くなります。上記の継承と比較して、組み合わせまたは集約を選択して、より頻繁に置き換えることができます。関連付けにより、継承する元のクラスが新しいクラスのコンポーネントとしてプログラムされます。新しいクラスの各インスタンスメソッドは、含まれている既存のクラスインスタンスの対応するメソッドを呼び出して、その結果を返すことができます。この動作は転送と呼ばれ、新しいクラスのメソッドは転送メソッドと呼ばれます。
総括する:
- 関連付け、集約、および組み合わせは、セマンティクスとコンテキストに関連してのみ判断できます。多くの場合、それらのコードは類似しているか、同じである可能性があります。
- 継承を使用するのは、実際に下位クラスと上位クラスの間に継承関係がある場合にのみ正しいです。
参照:
http://www.importnew.com/15490.html
「Javaオブジェクト指向プログラミング」:Sunweiqin