最近在看《Java編程思想》這一本書,看到第7章復用類,學習的時候查了查網上的資料,感覺都說得不是很清楚,就來說說我的看法。
復用類即實現代碼復用的類,Java中大概分為三種:組合、繼承、代理(實際Java沒有提供對代理的直接支持)。
- 組合:要使用A類的方法,為了不改變其原有結構,在一個新的類B中創建A類的一個對象a,以創建的這個對象a來調用A類的方法。
- 繼承:要使用A類的方法,不改變其原有結構,創建一個類B,繼承自A,這個類B擁有A類的所有方法和屬性,並能自身做擴展,擁有A所沒有的屬性和方法。
- 代理:要使用A類的方法,不改變其原有結構,在一個新的類B中創建A的對象a,並且在B中創建方法fb,方法內部是a調用A類的方法,但是使用時是B的對象調用其自身方法fb。
下面來看例子():
1.組合
//組合
//:multiplexing/Getresult.java
class Calculater {
Calculater() {
System.out.println("use composition");
}
int Sum() {
int res = 0;
for (int i = 0; i < 1000;i++) {
res += i;
}
return res;
}
}
public class Getresult {
private Calculater cal;
public Getresult(){
cal = new Calculater();
}
public static void main(String[] args) {
Getresult result = new Getresult();
System.out.println(result.cal.Sum());
}
}/*output use composition 499500 */
2.繼承
//:multiplexing/GetresultInheritance.java
public class GetresultInheritance extends Calculater{
GetresultInheritance(){
System.out.println("use inheritance");
}
public static void main(String[] args) {
GetresultInheritance result = new GetresultInheritance();
System.out.println(result.Sum());
}
}
/*output use inheritance 499500 */
3.代理
//:multiplexing/GetResultProxy.java
public class GetResultProxy {
private Calculater cal = new Calculater();
public long GetSum(){
System.out.println("use proxy");
return cal.Sum();
}
public static void main(String[] args) {
GetResultProxy result = new GetResultProxy();
System.out.println(result.GetSum());
}
}
/*output use proxy 499500 */
那么三種復用方式的訪問權限又是怎樣的呢?組合是調用類
1.組合
public class Getresult {
private Calculater cal;
public Getresult(){
cal = new Calculater();
}
public static void main(String[] args) {
Getresult result = new Getresult();
System.out.println("use compositon");
result.cal.B();
result.cal.C();
}
}
class Calculater {
Calculater() {
}
private void A () {
System.out.println("private method");
}
protected void B() {
System.out.println("protected method");
}
public void C() {
System.out.println("public method");
}
}/*output use compositon protected method public method */
2.繼承
public class GetresultInheritance extends Calculater{
GetresultInheritance(){
System.out.println("use inheritance");
}
public static void main(String[] args) {
GetresultInheritance result = new GetresultInheritance();
result.B();
result.C();
}
}/*output use inheritance protected method public method */
3.代理
public class GetResultProxy {
private Calculater cal = new Calculater();
public void B() {
cal.B();
}
public void C() {
cal.C();
}
public static void main(String[] args) {
GetResultProxy result = new GetResultProxy();
System.out.println("use proxy");
result.B();
result.C();
}
}/*output use proxy protected method public method */
可以看到,實際上三種方式都只能訪問protected和public方法,調用private方法則會報錯。雖然組合使用的是該類的成員對象調用方法,但是Java的private成員方法只支持包含該方法的類內部訪問。