1. 程式人生 > >java基礎——複用類

java基礎——複用類

複用類

1.組合語法

定義:將物件的引用置於新類之中。

特性:編譯器不是簡單的對每個物件的引用都建立預設物件,若要初始化這些引用,可在程式碼的下列位置行:

  • 在定義物件的時候
  • 在類的構造器中
  • 在正要使用這些類的時候。(惰性初始化,可以減少額外負擔)

2.繼承

2.1初始化基類

含有預設構造器的基類,在繼承時編譯器會自動呼叫預設構造器初始化基類,初始化的順序是從基類向新類初始化,如果含有有參構造器時,新類的構造器要顯示的呼叫基類的構造器,用關鍵字super來呼叫。

3.代理

3.1定義

Java沒有提供對代理(Proxy)的支援,它是繼承和組合的中庸之道。代理(Proxy)是一種設計模式,提供了對目標物件另外的訪問方式;即通過代理物件訪問目標物件,這樣做的好處是:可以在目標物件實現的基礎上,增強額外的功能操作,即擴充套件目標物件的功能。

3.2 靜態實現代理的方式

原理上講實現代理的方式可以用繼承和組合兩種方法,但是組合相對繼承來說更適用於代理。

3.3 JDK動態代理

動態代理類的位元組碼在程式執行時由Java反射機制動態生成,無需程式設計師手工編寫它的原始碼。動態代理類不僅簡化了程式設計工作,而且提高了軟體系統的可擴充套件性,因為Java 反射機制可以生成任意型別的動態代理類。java.lang.reflect 包中的Proxy類和InvocationHandler 介面提供了生成動態代理類的能力。

for example

有個Moveable介面,汽車實現Moveabel介面的方法,但是想增加move的計時功能。可以通過JDK的動態代理來實現。

public interface Moveable {
	public void move();
}
public class Car implements Moveable {
	public void move() {
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("car start running");
	}
}
public class TimeProxy implements InvocationHandler
{ private Object Target; TimeProxy(Object Target) { this.Target = Target; } /** * proxy 代理物件 method 代理方法 args 方法引數 Object 方法的返回值 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // before do some thing long start = System.currentTimeMillis(); method.invoke(Target); // after do some thing long end = System.currentTimeMillis(); System.out.println("car is running " + (end - start) + " mm"); return null; } }

測試方法

public class TestTimeProxy {
	public static void main(String[] args) {
		Car car = new Car();
		InvocationHandler h = new TimeProxy(car);
		Moveable move = (Moveable) Proxy.newProxyInstance(car.getClass().getClassLoader(),
				car.getClass().getInterfaces(), h);
		move.move();
	}
}

4.向上轉型

現有類Transport和類Car,若Transport transport = new Car(); 稱為向上轉型。

5.final關鍵字

  • final 修飾的基本資料是執行時被初始化,永不改變的。
  • final 修飾的物件引用是恆定不變的,一旦引用被初始化指向一個物件,就無法再把它指向另一個物件。但是物件本身是可以改變的。
  • 被static final 修飾的域只佔一段不能改變的儲存空間。