組合的兩個作用:
1)通過將父類對象作為子類的屬性
2)通過第1點的作用,實現了代碼復用。
示例代碼:
public class TestComponent {public static void main(String[] args) {Student2 s1= new Student2("jason",180,"Java");System.out.println(s1.person2.name);System.out.println(s1.person2.height);System.out.println(s1.major);}
}class Person2 {String name;int height;public void rest(){System.out.println("休息!");}
}class Student2 {Person2 person2 = new Person2();//Person2 是一個引用類型,類似于int這樣的類型聲明// person2 是一個對象、是一個變量、是一個屬性,類似于int a 里的a//new Person2()作用,就是新建了一個Person2 這個(父)類的對象//因為Person2先于Student2,所以叫它為父類String major;//專業、public void study(){System.out.println("學習!");person2.rest();//通過person2這個對象,來使用Person2類中的方法rest()}public Student2(String name, int height, String major) { //定義一個學生的對象構造器this.person2.name = name;//通過person2這個對象,來使用Person2類中的屬性namethis.person2.height = height;//通過person2這個對象,來使用Person2類中的屬性heightthis.major = major;}
}
運行結果:、
組合比較靈活。繼承只能有一個父類,但是組合可以有多個屬性。所以,有人聲稱“組合優于繼承,開發中可以不用繼承”,但是,不建議大家走極端。
?
對于“is -a”關系建議使用繼承,“has-a”關系建議使用組合。所以這里有一個在建模時的邏輯關系的問題。
比如:上面的例子,Student is a Person這個邏輯沒問題,但是:Student has a Person就有問題了。這時候,顯然繼承關系比較合適。
再比如:筆記本和芯片的關系顯然是“has-a”關系,使用組合更好。
?