Java編程中組合、繼承和代理的區別


最近在看《Java編程思想》這一本書,看到第7章復用類,學習的時候查了查網上的資料,感覺都說得不是很清楚,就來說說我的看法。
復用類即實現代碼復用的類,Java中大概分為三種:組合、繼承、代理(實際Java沒有提供對代理的直接支持)。

  1. 組合:要使用A類的方法,為了不改變其原有結構,在一個新的類B中創建A類的一個對象a,以創建的這個對象a來調用A類的方法。
  2. 繼承:要使用A類的方法,不改變其原有結構,創建一個類B,繼承自A,這個類B擁有A類的所有方法和屬性,並能自身做擴展,擁有A所沒有的屬性和方法。
  3. 代理:要使用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成員方法只支持包含該方法的類內部訪問。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM