接口深层理解

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

接口的电子设

备,而我们的

U

盘、

MP3

、移动硬盘及鼠标都是

USB

接口的实现类。

Java

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

如电脑,

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

可以更换,如

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

Java

是完全面向对

象的,而面向

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

Java

会很方便。在

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

Java

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

一个光盘的大

小。

Java

中的

JDBC

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

JDBC

只说明了目的,

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

面向对象就在我们眼前,

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

希望你在今后学习

Java

时,

多与现实社

会联系。这样

可以有利与你的理解。

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

class

文件,而

不是

java

文件

。如果你的客户需要更换

Killer

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

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

到定时器这个

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

定时器的设备

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

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

启动之后,每

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

其中时间间隔为

long

型,

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

串,也可能是

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

什么。

public class Timmer {

private long time;

时间: 2024-08-09 06:21:50

接口深层理解的相关文章

java中的接口深层理解

深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然.今天我们就一起来学习一下Java中的接口和抽象类.下面是本文的目录大纲: 一.抽象类 二.接口 三.抽象类和接口的区别 若有不正之处,请多多谅解并欢迎批评指正,不甚感激. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.

接口的理解

这个是自己的理解,因为我也是刚开始编程的菜鸟,所以会有很多错误,欢迎大家指导! 首先按我的理解来说一个例子(这个例子被很多人提过,下面的这个是按我自己的理解来说的): 小王是一个苦逼(酷毙)程序员,他要开发一个程序,其中要实现一个功能:连接到一个数据库,要对数据库进行一些操作.实现功能首先需要有一个数据库,在开发的时候他使用的A厂家的数据库.假设A厂家提供的类库中实现小王需要的功能的类是DataA,小王创建一个DataA实例,然后调用DataA类中的方法.假设DataA类连接数据库的方法为Con

关于Java中继承和接口的理解

关于Java中继承和接口的理解 Java语言中,为了实现代码重用,设计了继承这一机制,但是,其设计成单继承,这样设计是有原因的,如下图: Figure1:deadly diamond of death 此图问题称为菱形问题(diamond problem),就是说,当A的子类B和C同时实现了A中的方法,则同时继承了B和C的子类D在调用该方法时会出现混乱,无法得知该调用哪一个方法. 既然不能实现多继承,我们就会考虑把很多方法就写在父类里,或者继承抽象类,实现其方法,但是,这样会导致一个问题,比如说

【转】C#中对IDisposable接口的理解

IDisposable接口定义:定义一种释放分配的资源的方法. .NET 平台在内存管理方面提供了GC(Garbage Collection),负责自动释放托管资源和内存回收的工作,但它无法对非托管资源进行释放,这时我们必须自己提供方法来释放对象内分配的非托管资源,比如你在对象的实现代码中使用了一个COM对象 最简单的办法可以通过实现Finalize()来释放非托管资源,因为GC在释放对象时会检查该对象是否实现了 Finalize() 方法. 有一种更好的,那就是通过实现一个接口显式的提供给客户

poj水题-3062 超级水题的深层理解——代码简化

题目很简单,要求输入什么样输出什么样.以回车结束 这就是我用的C代码 #include <stdio.h> int main (){char p;for(;gets(&p);)puts(&p);return 0;} 使用了代码简化方案,我简化到了75B.有大神简化到31B,真想看看他们的源代码.我估计他们比我个能够了解语言规则. 这里不得不说一本叫<短码之美>的书.介绍了这道题.但我试过了,没用.可能系统升级了吧,必须要求C99. ,还听说不用#include也行,

C#中对IDisposable接口的理解

http://blog.sina.com.cn/s/blog_8abeac5b01019u19.html 本人最近接触一个项目,在这个项目里面看到很多类实现了IDisposable接口.在我以前的项目中都很少用过这个接口,只知道它是用来手动释放资源的.这么多地方用应该有它的好处,为此自己想对它有进一步的了解,但这个过程远没有我想象中的简单. IDisposable接口定义:定义一种释放分配的资源的方法. .NET 平台在内存管理方面提供了GC(Garbage Collection),负责自动释放

android中Logcat的深层理解

Android的开发也可以归类为嵌入式设备的开发,即便不是嵌入式开发,依然要注意对内存和处理的使用.养成一个好的习惯对自己的帮助是很大的. 在Log的源码中可以看到这样的注释: The order in terms of verbosity, from least to most is * ERROR, WARN, INFO, DEBUG, VERBOSE. Verbose should never be compiled * into an application except during

tair中对get/get_range接口的理解及为get_range添加命令行测试接口

经过这段时间对淘宝开源K/V缓存系统tair基础接口put/get/get_range等源码的详细剖析后,按自己的理解简单总结下tair中我较关心的get和get_range这两个接口的基本实现流程.由于get_range接口是最新几个版本才加入的功能,因此以前的tair Java客户端及最新版本安装后的命令行测试中都没有加入get_range测试接口,这无疑给需要专门优化get_range接口的我带来了不便,因此本文最后给出了在tair中实现get_range命令行测试的方法和示例. 1 ta

HDOJ1016 Prime Ring Problem(DFS深层理解)

Prime Ring Problem 时间限制: 2000ms               内存限制: 32768KB                HDU       ID: 1016 题目描述 A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each circle separately, and the sum of numbers in two adjacent