接口深层理解

JAVA

接口理解

.txt27

信念的力量在于即使身处逆境,

亦能帮助你鼓起前进的船帆;

信念的魅

力在于即使遇到险运,亦能召唤你鼓起生活的勇气;信念的伟大在于即使遭遇不幸,亦能促

使你保持崇高的心灵。

java

接口实现

  

对初学者来说,接口不是很好理解。现将某高手的一篇文章贴出来,共大家分享!

 

我们来看一个类

  

class A {  

private int a;  

public int getA() {  

return a;  

}  

}  

这个类的属性是私有的,外界不能访问,而外界可以通过公有方法来访问这个类。我们说一

个类的公有方

 

法就是这个类的对外接口。通常

  

一个类的属性都是私有的,方法大多是公有的。外界只能过个这些公有方法来访问类。这也

Java

封装性

 

的体现。如果一个类没有公有属性,

  

也没有公有方法,这个类就是无法使用的类了。所以我们需要为一个类提供对外接口。

  

一个类中的方法,不只是说明了它要“做什么”

,而且方法的内容也说明了“怎么做”

。打个

不太恰当的

 

例子,一个杀人方法。从名字上看,你知道了“做什么”

,但没有办法看到“怎么做”

。而方

法的内容说

 

明了“怎么做”

  

class killer {  

private String name;  

private int age;  

private String phone;  

private String addr;  

......  

public void kill(Person p) {  

Qiang qiang = new Qiang("ak47");  

qiang.fire(p);  

}  

}  

这个类的

kill

方法内容说明了杀人的过程。如果你不想用这种方式杀人。因为你很

BT

,你

想用毒药杀人。

 

那么这个类的内容就需要改。但是,还有很多其它的“客户”

,需要用不同的方式杀人。怎么

办呢?一个

 

很好的办法就是,我们只定义“做什么”

,而不定义“怎么做”

  

interface Killer {  

public void kill(Person p);  

}  

接口说明了“做什么”

,而实现这个接口的类,也就是实现类需要说明“怎么做”

  

class Killer1 implements Killer {  

public void kill(Person p) {  

Qiang qiang = new Qiang("ak47");  

qiang.fire(p);  

}  

}  

class Killer2 implements Killer {  

public void kill(Person p) {  

Bane bane = new Bane();  

p.eat(bane);  

}  

}  

public class Test {  

public static void main(String[] args) {  

Killer jingKe = new Killer1();  

Person yingZheng = new Person();  

jingKe.kill(yingZheng);  

}  

}  

接口可以把“做什么”和“怎么做”分离开来。这给

Java

带来了很多好处。虽然代码量增加

了,可我们的

 

程序的可维护性加强了。我们的程序是可以拆分的。就象电脑一样,可以拆分成很多组件。

我一直在想,

 

如果我的

MP3

耳机可以拆分就好了,那样在耳机只坏掉一个的时候就不用重新买一个了。

  

不过上面的例子看不到什么太大的好处。你可能会说,如果你的目的是为了不修改代码,那

么,如果我想

 

使用

Killer2

来完成任务,还是需要修改

main

方法为:

Killer jingKe = new Killer2();

没有错,

  

不过你可以通过一个工厂来完成上面的任务。

也就是说,

不通过

new

语句来获得

Killer

对象,

而是通过工

 

厂来获得

Killer

对象。

  

public class KillerFactory {  

public static killer getKiller() {  

return new Killer1();  

}  

public static Killer getKiller(String path) throws Exception {  

Properties prop = new Properties();  

prop.load(new FileInputStream(path));  

String className = prop.getProperty("killer");  

Class clazz = Class.forName(className);  

return (Killer)clazz.newInstance();  

}  

}  

代码确实增加了很多,可是这对后期的系统维修和系统升级带来了很多好处。

  

水龙头与出水管的关系,我们需要把水龙头安装到出水管上。如果有一天我们需要更换水龙

头时,只需要

 

把老的水龙头拆卸下来,

把新的水龙头安装到出水管上即可。

如果水龙头与出水管是一体的,

就是无法拆

 

卸的怎么办呢?或是说出水管只能安装水龙头,而不能安装淋浴器,这就使我们生活很不方

便。我们可以

 

理解为出水管的连接方法,连接的对象是“出水设备”

,而这个“出水设备”是一个接口。而

水龙头与淋

  

浴器都是这个接口的实现类。但是接口在哪里呢?它长什么样子?我们没看到。它是一个标

准,连接处的

 

内径与外径。螺丝抠的密度等。这就和你的电脑上为什么可以连接

USB

设备一样。如果电脑

和某一个

USB

 

备电焊到一起,那么其它的

USB

设备就无法使用了。电脑使用的是实现了

USB

接口的电子设

备,而我们的

盘、

MP3

、移动硬盘及鼠标都是

USB

接口的实现类。

 

Java

写出来的程序也和我们现实生活中的设备一样。

如电脑,

我们希望电脑的所有部件都

可以更换,如

 

果主板上的内存插槽与内存条不附。我们说,内存条没有实现某某接口。

Java

是完全面向对

象的,而面向

 

对象是我们最为熟悉的东东。面向对象并不简单,而是我们太熟悉它了。所以我们学习

Java

会很方便。在

 

现实社会中,所有的标准到了

Java

中都是接口。一盒香烟多少支烟,烟的长度等都是标准。

一个光盘的大

  

小。

Java

中的

JDBC

就是一个标准,而各大数据库厂商及第三方厂商实现了这一标准。

JDBC

只说明了目的,

 

没有说明怎么完成的目的。

  

面向对象就在我们眼前,

不过我们有时不太注意它。

希望你在今后学习

Java

时,

多与现实社

会联系。这样

 

可以有利与你的理解。

  

代码量加大了,但对后期的维护与升级提供了方便。软件公司卖给客户的是

class

文件,而

不是

java

文件

 

。如果你的客户需要更换

Killer

对象,只需修改资源文件既可。

  

下面我们来看一个定时器类。现在什么都是自动化的,如空调、电视、洗衣机等等。都要用

到定时器这个

 

类。对了,还有定时炸弹也要用它。那我们可不可以只写一个定时器类,应用到所有的需要

定时器的设备

 

上呢?答案是肯定的,我们需要这个类。

  

好了,我们来分析一下定时器需要完成什么工作吧。定时器应该有启动、停止方法。定时器

启动之后,每

 

过一定时间就执行某个动作。

其中时间间隔为

long

型,

而要执行的动作可能是输出一个字符

串,也可能是

 

打印作业。具体要干什么由使用定时器的用户来完成。而定义定时器时,根本就不知道要干

什么。

  

public class Timmer {  

private long time;

private Action action;  public Timmer() {}  
public Timmer(long time, Action action) {  this.time = time;  this.action = action;  }  
public void start() {  state = START;  if(th == null) {  th = new Thread() {  public void run() {  while(state == START) {  try {  
Thread.sleep(time);  action.action();  
} catch(Exception e) {  }  }  }  };  }  
th.start();  }  
public void stop() {  state = STOP;  }  
public void setTime(long time) {  this.time = time;  }  
public void setAction(Action action) {  this.action = action;  }  
public long getTime() {  return (this.time);  }  
public Action getAction() {  return (this.action);  }  }  
Action是一个接口,它只有一个方法,就是要完成的任务。我们在定时器启动时调用这个接口的方法。而 
这个Action接口的对象,代表一个动作,这个动作就是用户要完成的动作。  public interface Action {  public void action();  

}  
public static void main(String[] args) {  Timer t = new Timer(2000, new Action() {  public void action() {  
System.out.println("Hello World!");  }  });  
t.start();  
javax.swing.JOptionPane.showMessageDialog(null, "点击确定按钮停止定时器");  t.stop();  
System.exit(0);  }  
这是一个典型的回调方法例子。在AWT中,java使用了大量的监听器。这些监听器都是回调方法。在XML解 
析器SAX中,也使用了回调方法来解析XML文档。  
接口要比抽象类还要抽象。抽象类需要子类继承,而Java是单继承,所以抽象类被限制了。而接口不同, 
一个类可以实现多个接口。好比人类与程序员类之间的关系。可以说程序员是人类的子类,如果程序员是 
一个接口。用人类的子类来实现它就会更好。这个子类还可以去实现会计接口、音乐家接口等等。  
在struts2.0、spring、hibernate等框架中,都大量使用接口。我们关心的是某个接口与另一个接口之间 
的关系。而不关心某个实现类与另一个接口实现类的关系。在客观世界中,我们交谈时都大量使用接口, 
只是我们没有注意罢了。如:我公司需要一个程序员(一个实现了程序员接口的对象)。上课时,讲师有一 
台计算机,用白板笔在白板上写字(计算机是接口,白板及白板笔也是接口)。讲师希望学生能学会所有的 
知识(讲师及学生都是接口)。

原文地址:https://www.cnblogs.com/FengzZ/p/4901392.html