java基礎——複用類
阿新 • • 發佈:2018-12-31
複用類
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 修飾的域只佔一段不能改變的儲存空間。