`
给一理由先
  • 浏览: 24386 次
  • 性别: Icon_minigender_1
  • 来自: 衡阳
文章分类
社区版块
存档分类
最新评论

关于接口的一点学习心得(2)

阅读更多
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接口的电子设备,而我们的U
盘、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等框架中,都大量使用接口。我们关心的是某个接口与另一个接口之间
的关系。而不关心某个实现类与另一个接口实现类的关系。在客观世界中,我们交谈时都大量使用接口,
只是我们没有注意罢了。如:我公司需要一个程序员(一个实现了程序员接口的对象)。上课时,讲师有一
台计算机,用白板笔在白板上写字(计算机是接口,白板及白板笔也是接口)。讲师希望学生能学会所有的
知识(讲师及学生都是接口)。
分享到:
评论

相关推荐

    关于51的一点心得

    【标题】:“关于51的一点心得” 在嵌入式系统的世界里,51单片机(MCU)是入门者最常接触的一种芯片。它以其简单易学、功能实用的特点,深受广大电子爱好者和工程师的喜爱。这个标题“关于51的一点心得”暗示了...

    个人FPGA学习心得.pdf

    "个人FPGA学习心得" 个人FPGA学习心得(一):Verilog语言的学习 在学习FPGA的过程中,选择合适的硬件描述语言是非常重要的。现在主要的硬件描述语言有两种:VHDL和Verilog。由于Verilog的易用性和灵活性,选择了...

    关于数字模拟集成电路的一点心得

    ### 关于数字模拟集成电路的一点心得 #### 一、数字模拟集成电路概述 数字模拟集成电路(Digital-Analog Integrated Circuit)是一种将数字电路与模拟电路集成在同一芯片上的技术。这种技术能够实现数字信号处理与...

    java学习心得

    ### Java学习心得与最佳实践详解 #### 隐藏数据的重要性 - **基本原则**:“所有数据都应该隐藏在所在的类的内部。”这句话强调了封装的概念。在Java中,这意味着使用`private`关键字来限制类的成员变量的可见性。...

    FIFO学习心得

    ### FIFO学习心得详解 #### 一、FIFO概念与应用场景 **FIFO**,全称为First In First Out(先进先出),是一种特殊类型的数据缓存器。与传统的存储器相比,FIFO没有外部读写地址线,这使得其使用更加简便。然而,...

    STM32 一点心得

    TFT液晶屏通常用于构建图形用户界面,STM32可以通过SPI或I2C接口与之通信。显示过程涉及到点坐标系统、颜色模式、刷新率等概念。开发过程中需编写驱动程序来处理命令和数据传输,同时理解液晶屏的硬件特性,如分辨率...

    Linux学习心得——内存管理方法

    ### Linux学习心得——内存管理方法 #### 1. 概述 本文主要针对Linux操作系统中的内存管理技术进行探讨,特别是针对内核版本2.6.32的TI Linux-Davinci-Staging。本文将从以下几个方面展开讨论: - **Linux内核...

    调试SPI+DMA的一点心得

    首先,项目需求是通过STM32F303作为主机,利用SPI接口与STM32F405进行双向通信,传输大量的数据。在初始设置中,仅使用了MISO(主设备输入,从设备输出)、MOSI(主设备输出,从设备输入)和CLK(时钟)三根信号线,...

    华为数通HCNA学习笔记-第四天

    华为的HCNA培训强调了这一点,目的是让学习者了解免费ARP在网络管理中的实际应用。 RARP(反向地址解析协议)允许设备使用自己的MAC地址来请求网络中的IP地址。与ARP相反,RARP通常用于无盘工作站启动过程中,用于...

    嵌入式开发指导的一点心得

    嵌入式开发是一种针对特定应用...无论是电子工程师还是软件工程师,都需要不断学习和适应新的技术趋势,以应对嵌入式系统日益复杂和多样化的需求。在这一领域,既有挑战,也充满了机遇,是IT行业中极具前景的一个分支。

    ARP攻击的一点心得网站安全电脑资料.doc

    2. **中间人攻击(Man-in-the-Middle,MITM)**:在ARP欺骗的基础上,攻击者可以拦截并读取两台通信设备之间的数据流,甚至篡改数据包内容,而双方设备对此毫不知情。 3. **ARP缓存中毒(ARP Cache Poisoning)**:...

    从EPON设计中得到的一点心得.pdf

    ONU放置在用户端,负责提供业务接口。 在EPON系统设计中,首先要考虑的是OLT的位置。在大规模的光进铜退项目中,对于用户接入量大的小区,将OLT放置在小区内部的机房中可以减少传输距离和衰减,提高网络的稳定性和...

    软件开发人员实习心得体会.doc

    设计模式是我到公司才接触的事物,主要是讲述一种面向接口的编程思维,按照设计模式所编写的代码,会比学校那种直接实现功能的代码繁琐一点,增加很多看似多余的虚类或者接口。但是这种代码更加具有拓展性,更好地把...

    软件工程实训心得体会精选.docx

    【标题】: 软件工程实训心得体会 【描述】: 这篇文章是对软件工程实训课程的个人体验和收获的总结,强调了理论与实践相结合的重要性。 【标签】: 范文 【正文】: 在软件工程的学习过程中,实训环节起到了至关...

    参加广播电视台技术交流心得体会.docx

    首先,关于传输发射技术的维护案例,通过《传输发射技术维护案例汇编》中的实例,我了解到了10kw中波发射机功率记忆电路故障这一典型软故障问题。在故障发生时,发射机无法记忆原先设置的功率状态,从而需要技术人员...

    chrome ui 框架学习笔记

    本文档旨在深入探讨Chrome UI框架的基本概念、架构及其实现原理,尤其关注于作者邱金武在学习过程中积累的经验和心得。以下内容将详细阐述Chrome UI框架的几个核心方面。 #### 二、基本结构与组成 ##### 1. 控件...

    单片机STM32学习笔记.docx

    本文档旨在记录STM32单片机的学习心得,探讨其输出类型、电压兼容性、开漏电路特性、I2C通信协议以及时钟系统等方面的细节知识。 在STM32单片机的学习中,我们首先要掌握的是输出类型的概念。输出类型主要分为推挽...

    软件工程课程心得.doc

    在我们的校园B2C电子商务网站项目中,我们忽视了这一点,初期并未充分理解客户(老师)的需求,导致设计反复修改。这让我明白了,与客户保持持续沟通,深入理解他们的需求和期望,是避免浪费时间和资源的关键。需求...

    api大全

    标题中的"api大全"暗示了这个压缩包包含的是与API(应用程序编程接口)相关的各种资料,而描述中的"api,daquan"进一步确认了这一点,表明这是一个关于API的全面资源集合。标签为"我的笔记"可能意味着这些内容是个人...

Global site tag (gtag.js) - Google Analytics