一、java中的接口本質(zhì)上是加約束的抽象類(lèi)
//抽象類(lèi)
public abstract class AExample
{
public abstract int add(int x,int y);
public abstract int sub(int x,int y);
}
//接口
public interface IExample
{
public int add(int x,int y);
public int sub(int x,int y);
}
通常的用法是創(chuàng)建一個(gè)新類(lèi),這個(gè)類(lèi)實(shí)現(xiàn)接口或從抽象類(lèi)派生。這個(gè)新類(lèi)要實(shí)現(xiàn)接口中定義的全部方法,或?qū)崿F(xiàn)抽象類(lèi)中的全部抽象方法。
1、抽象類(lèi)的實(shí)現(xiàn)方法:
public class MyClass extends AExample
{
//其它成員定義:略
//實(shí)現(xiàn)抽象類(lèi)中的抽象方法
public int add(int x,int y)
{
return x+y;
}
public int sub(int x,int y)
{
return x-y;
}
//其它部分:略
}
使用方法:
AExample ae = new MyClass();
int s = ae.add(4,2);
int t = ae.sub(4,2);
2、接口的實(shí)現(xiàn)方法:
public class MyClass implements IExample
{
//其它成員定義:略
//實(shí)現(xiàn)抽象類(lèi)中的抽象方法
public int add(int x,int y)
{
return x+y;
}
public int sub(int x,int y)
{
return x-y;
}
//其它部分:略
}
使用方法:
IExample ae = new MyClass();
int s = ae.add(4,2);
int t = ae.sub(4,2);
可見(jiàn),兩者本質(zhì)是一樣的,使用方法也是非常相似的。
二、特殊實(shí)現(xiàn)方法
這里不使用上述從抽象類(lèi)的派生新類(lèi)和用接口實(shí)現(xiàn)的新類(lèi)的方法。
1、先來(lái)看一下數(shù)組的初始化例子:
int[] array;
這樣定義數(shù)組后,array僅僅是個(gè)引用,array[0],array[1]沒(méi)有實(shí)現(xiàn),即不存在。但是如果在定義時(shí)初始化為:
int[] array = new int[]{1,2};
1和2看成是數(shù)組的兩個(gè)“成員實(shí)例”。這時(shí)array[0],array[1]就被實(shí)現(xiàn)了,也即array被實(shí)現(xiàn)了。
2、接口和抽象類(lèi)都可以用類(lèi)似的方法實(shí)現(xiàn):
- AExample ae = new AExample(){
- public int add(int x,int y)
- {
- return x+y;
- }
- public int sub(int x,int y)
- {
- return x-y;
- }
- };
- int s = ae.add(4,2);
- int t = ae.sub(4,2);
這里的所謂“成員實(shí)例”就是具體的兩個(gè)方法add和sub的實(shí)現(xiàn)。
又
- IExample ae = new IExample(){
- public int add(int x,int y)
- {
- return x+y;
- }
- public int sub(int x,int y)
- {
- return x-y;
- }
- };
- int s = ae.add(4,2);
- int t = ae.sub(4,2);
很神奇吧!
三、總結(jié)
實(shí)際上這種方法在一般情況下用得比較少,主要應(yīng)用于事件處理問(wèn)題當(dāng)中。并且主要使用接口。
上面的形式是本人在學(xué)習(xí)java的事件處理編程時(shí)遇到一個(gè)疑問(wèn):為什么java的事件監(jiān)聽(tīng)者注冊(cè)時(shí)使用的形式是這樣的:
//Person是本人設(shè)計(jì)的一個(gè)含有事件處理的類(lèi),PersonListener是個(gè)接口--監(jiān)聽(tīng)者接口
Person p = new Person("Tong",53);
/////////////////////////////////////////////////////////////////////////////////////////////////////////
//創(chuàng)建事件監(jiān)聽(tīng)者接口的實(shí)例并注冊(cè)
p.addPersonListener( new PersonListener(){
public void OnNameChanged(PersonEventObject e)
{
//自定義事件處理代碼
System.out.println("Name :"+((Person)(e.getSource())).getName());
}
public void OnAgeChanged(PersonEventObject e)
{
//自定義事件處理代碼
System.out.println("Name :"+((Person)(e.getSource())).getName());
}
});
//////////////////////////////////////////////////////////////////////////////////////////////////
將上述p.addPersonListener(...)分成兩個(gè)步驟就一清二楚了:
PersonListener pl = new PersonListener(){
public void OnNameChanged(PersonEventObject e)
{
//自定義事件處理代碼
System.out.println("Name :"+((Person)(e.getSource())).getName());
}
public void OnAgeChanged(PersonEventObject e)
{
//自定義事件處理代碼
System.out.println("Name :"+((Person)(e.getSource())).getName());
}
};
p.addPersonListener(pl);
看一看,就是我們上面討論的問(wèn)題。
通過(guò)這個(gè)例子,希望許多初學(xué)java的人會(huì)有所得。
原文參考自站長(zhǎng)網(wǎng)http://www.software8.co/wzjs/java/2743.html