一暇务、接口的結(jié)構(gòu):
- 抽象方法
- 全局常量
public interface InterfaceA {
public static final String PRINT = "print";
public abstract void print();
}
Modifier 'static' is redundant for interface fields
修飾符'static'對于接口字段是多余的.
最終寫法:
public interface InterfaceA {
String PRINT = "print";
void print();
}
public interface InterfaceB {
String HELLO = "Hello world";
void sayHello();
}
-
其他內(nèi)部結(jié)構(gòu)
- 內(nèi)部類
- 內(nèi)部抽象類
- 內(nèi)部接口
public interface InterfaceA {
String PRINT = "print"; // 很少直接在接口里定義全局常量
void print();
interface InternalA{
void test1();
}
class A{
public void test() {
}
}
abstract class BB{
public abstract void test();
}
}
二泼掠、接口和抽象類
抽象類可以實現(xiàn)接口,但接口不能繼承抽象類垦细。接口可以繼承多個接口
public abstract class AbstractA implements InterfaceA{
}
public interface InterfaceC extends InterfaceA, InterfaceB {
}
public class TestImpl implements InterfaceC {
public void print() {
System.out.println(PRINT);
}
public void sayHello() {
System.out.println(HELLO);
}
}
三 择镇、使用接口定義標(biāo)準(zhǔn)
四、工廠設(shè)計模式
三要素:
- 接口(標(biāo)準(zhǔn))括改,
- 具體實現(xiàn)類腻豌,
- 中間層(工廠類)
中間層不需要普通屬性,所以方法定義為static。
//接口類
public interface Fruit {
void eat();
}
// 具體實現(xiàn)類
public class Apple implements Fruit {
public void eat() {
System.out.println("吃蘋果...");
}
}
public class Cherry implements Fruit {
public void eat() {
System.out.println("eat cherry...");
}
}
//工廠類
public class FruitFactory {
public static Fruit getInstance(String className) {
if (className.equals("Apple")) {
return new Apple();
} else if (className.equals("Cherry")) {
return new Cherry();
} else {
return null;
}
}
}
// 測試類
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
Fruit fruit = FruitFactory.getInstance(s);
fruit.eat();
}
}
五 吝梅、代理設(shè)計模式
首先理解下概念:
代理設(shè)計模式是 在不改變源碼
的情況下虱疏,實現(xiàn)對目標(biāo)對象的功能擴(kuò)展
- 靜態(tài)代理
public interface Subject {
void get(); // 核心操作主題
}
public class RealSubject implements Subject {
public void get() {
System.out.println("真實主題..."); //真實主題
}
}
public class ProxySubjcet implements Subject {
private Subject subject; // 代理的真實主題
public ProxySubjcet(Subject subject) {
this.subject = subject;
}
public void prepare() {
System.out.println("正式主題開始前的準(zhǔn)備...");
}
public void get() {
prepare();
subject.get(); // 真實主題
destory();
}
public void destory() {
System.out.println("主題結(jié)束之后的完善工作...");
}
}
public static void main(String[] args) {
// 靜態(tài)代理的實現(xiàn)
Subject subject = new ProxySubjcet(new RealSubject());
subject.get();
}
- 動態(tài)打理
final RealSubject realSubject = new RealSubject();
Subject subject = (Subject) Proxy.newProxyInstance(
realSubject.getClass().getClassLoader(),
realSubject.getClass().getInterfaces(),
new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("開始前的準(zhǔn)備");
// 執(zhí)行目標(biāo)方法
Object invoke = method.invoke(realSubject, args);
System.out.println("結(jié)束之后的完善");
return invoke;
}
}
);
subject.get();
-
Cglib
代理
六苏携、抽象類和接口的區(qū)別
類是共性 對象是個性
區(qū)別:
區(qū)別 | 抽象類 | 接口 |
---|---|---|
定義關(guān)鍵字 | abstract | interface |
組成 | 屬性做瞪,常量,抽象右冻、構(gòu)造装蓬、普通方法 | 抽象方法,全局常量 |
權(quán)限 | 各種權(quán)限 | public |
子類實現(xiàn) | extends單繼承一個抽象類 | implements 實現(xiàn)多個接口 |
關(guān)系 | 抽象類可以實現(xiàn)多個接口 | 接口不能繼承抽象類国旷,但接口利用extends實現(xiàn)接口的多繼承 |
對象實例化 | 依靠子類對象的向上轉(zhuǎn)型實現(xiàn)抽象類或者接口的實例化 | 同← |
設(shè)計模式 | 模板設(shè)計模式 | 工廠設(shè)計模式矛物,代理設(shè)計模式 |
操作局限 | 單繼承局限 | 沒有單繼承局限 |
通過以上,抽象類和接口都可以限制子類要覆寫的方法要求跪但,當(dāng)抽象類和接口都可以實現(xiàn)的情況下履羞,優(yōu)先考慮接口
,而抽象類在實際應(yīng)用中屡久,往往作為接口和普通類之間的過渡來使用
忆首。