1. 程式人生 > >黑馬程式設計師- 動態代理 ,介面 ,抽象類

黑馬程式設計師- 動態代理 ,介面 ,抽象類

包含抽象方法的類稱為抽象類,但並不意味著抽象類中只能有抽象方法,它和普通類一樣,同樣可以擁有成員變數和普通的成員方法。注意,抽象類和普通類的主要有三點區別:

  1)抽象方法必須為public或者protected(因為如果為private,則不能被子類繼承,子類便無法實現該方法),預設情況下預設為public。

  2)抽象類不能用來建立物件;

  3)如果一個類繼承於一個抽象類,則子類必須實現父類的抽象方法。如果子類沒有實現父類的抽象方法,則必須將子類也定義為為abstract類。
在其他方面,抽象類和普通的類並沒有區別。
interface 介面泛指供別人呼叫的方法或者函式,介面中的變數會被隱式地指定為public static final變數(並且只能是public static final變數,用private修飾會報編譯錯誤),而方法會被隱式地指定為public abstract方法且只能是public abstract方法(用其他關鍵字,比如private、protected、static、 final等修飾會報編譯錯誤),並且介面中所有的方法不能有具體的實現,也就是說,介面中的方法必須都是抽象方法。從這裡可以隱約看出介面和抽象類的區別,介面是一種極度抽象的型別,它比抽象類更加“抽象”,並且一般情況下不在介面中定義變數。
1)抽象類可以提供成員方法的實現細節,而介面中只能存在public abstract 方法;

  2)抽象類中的成員變數可以是各種型別的,而介面中的成員變數只能是public static final型別的;

  3)介面中不能含有靜態程式碼塊以及靜態方法,而抽象類可以有靜態程式碼塊和靜態方法;

  4)一個類只能繼承一個抽象類,而一個類卻可以實現多個介面

動態代理

“`
代理設計模式:為其他物件提供一種代理以控制對這個物件的訪問。
動態代理使用:

public interface Subject
{
public void doSomething();
}
public class RealSubject implements Subject
{
public void doSomething()
{
System.out.println( “call doSomething()” );
}
}
public class ProxyHandler implements InvocationHandler
{
private Object proxied;

public ProxyHandler( Object proxied )
代理設計模式:為其他物件提供一種代理以控制對這個物件的訪問。
動態代理使用:public interface Subject
{
public void doSomething();
}
public class RealSubject implements Subject
{
public void doSomething()
{
System.out.println( “call doSomething()” );
}
}
public class ProxyHandler implements InvocationHandler
{
private Object proxied;

public ProxyHandler( Object proxied )
“`{
this.proxied = proxied;
}

public Object invoke( Object proxy, Method method, Object[] args ) throws Throwable
{
//在轉調具體目標物件之前,可以執行一些功能處理

//轉調具體目標物件的方法
return method.invoke( proxied, args);  

//在轉調具體目標物件之後,可以執行一些功能處理

}
}
}

public interface Subject
{
public void doSomething();
}
public class RealSubject implements Subject
{
public void doSomething()
{
System.out.println( “call doSomething()” );
}
}
public class ProxyHandler implements InvocationHandler
{
private Object proxied;
public ProxyHandler( Object proxied )
{
this.proxied = proxied;
}

public Object invoke( Object proxy, Method method, Object[] args ) throws Throwable
{
//在轉調具體目標物件之前,可以執行一些功能處理

//轉調具體目標物件的方法
return method.invoke( proxied, args);  

//在轉調具體目標物件之後,可以執行一些功能處理

}
}