- 浏览: 409738 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
dageda_jgw:
...
JSF定义及原理 -
尘土飞扬:
这个在NB7中已经无效了,加不加都会提示 UTF8打不开
Netbeans统一UTF-8编码的方法 -
ouyangkang20:
不对
Struts target is null for setProperty(null, "x", [Ljava.lang.String;@179da9f) -
wpf523:
hahah,很不错啊
mysql安装图解教程 5.1 -
taburissmeng:
action中相应的属性没有set get方法就会报这样的错。 ...
Struts target is null for setProperty(null, "x", [Ljava.lang.String;@179da9f)
接口是实现构件可插入性的关键,可插入构件的关键在于存在一个公用的接口,以及每个构件实现了这个接口。
什么是接口?
Java 中的接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。
接口的两种含义:一, Java 接口, Java 语言中存在的结构,有特定的语法和结构;二,一个类所具有的方法的特征集合,是一种逻辑上的抽象。前者叫做“ Java 接口”,后者叫做“接口”。
在 Java 语言规范中,一个方法的特征仅包括方法的名字,参数的数目和种类,而不包括方法的返回类型,参数的名字以及所抛出来的异常。在 Java 编译器检查方法的重载时,会根据这些条件判断两个方法是否是重载方法。但在 Java 编译器检查方法的置换时,则会进一步检查两个方法(分处超类型和子类型)的返还类型和抛出的异常是否相同。
接口继承和实现继承的规则不同,一个类只有一个直接父类,但可以实现多个接口。
Java 接口本身没有任何实现,因为 Java 接口不涉及表象,而只描述 public 行为,所以 Java 接口比 Java 抽象类更抽象化。
Java 接口的方法只能是抽象的和公开的, Java 接口不能有构造器, Java 接口可以有 public, 静态的和 final 属性。
接口把方法的特征和方法的实现分割开来。这种分割体现在接口常常代表一个角色,它包装与该角色相关的操作和属性,而实现这个接口的类便是扮演这个角色的演员。一个角色由不同的演员来演,而不同的演员之间除了扮演一个共同的角色之外,并不要求其它的共同之处。
为什么使用接口?
两个类中的两个类似的功能,调用他们的类动态的决定一种实现,那他们提供一个抽象父类,子类分别实现父类所定义的方法。
问题的出现: Java 是一种单继承的语言,一般情况下,哪个具体类可能已经有了一个超类,解决是给它的父类加父类,或者给它父类的父类加父类,只到移动到类等级结构的最顶端。这样一来,对一个具体类的可插入性的设计,就变成了对整个等级结构中所有类的修改。
接口是可插入性的保证。
在一个等级结构中的任何一个类都可以实现一个接口,这个接口会影响到此类的所有子类,但不会影响到此类的任何超类。此类将不得不实现这个接口所规定的方法,而其子类可以从此类自动继承这些方法,当然也可以选择置换掉所有的这些方法,或者其中的某一些方法,这时候,这些子类具有了可插入性(并且可以用这个接口类型装载,传递实现了他的所有子类)。
我们关心的不是那一个具体的类,而是这个类是否实现了我们需要的接口。
接口提供了关联以及方法调用上的可插入性,软件系统的规模越大,生命周期越长,接口使得软件系统的灵活性和可扩展性,可插入性方面得到保证。
类型
使用 Java 接口将软件单位与内部和外部耦合起来。使用 Java 接口不是具体的类进行变量的类型声明,方法的返还类型声明,参量的类型声明,以及数据类型的转换。
在理想的情况下,一个具体的 Java 类应当只实现 Java 接口和抽象 Java 类中声明的方法,而不应当给多余方法。
类型等级结构
Java 接口(以及抽象类)一般用来作为一个类型的等级结构的起点。
如果一个类已经有了一个主要的超类型,那么通过实现一个接口,这个类可以拥有另一个次要的超类型,这种次要的超类型叫做混合类型。
Java 接口常用方法
单方法接口
public interface Actionlistener(){
public abstract void actionPerformed(ActionEvent event);
}
仅且只有一个方法,只有实现了这个接口(重写这个接口中的唯一一个方法),你才有资格去事件监听器列表里注册(参数为 Actionlistener 类型),当事件源变动时,自动调用这个唯一的 actionPerformed 方法 .
标识接口
是没有任何方法和属性的接口。标识接口不对实现它的类有任何语意上的要求,它仅仅表明了实现它的类属于一个特定的类型(传递)。
不推荐过多的使用标识接口。
常量接口
用 Java 接口来声明一些常量,然后由实现这个接口的类使用这些常量(以前在做画板的时候这么干过)。建议不要模仿这种常量接口的做法。
Java 语言类型安全问题
Java 是强类型的语言。这意味着 Java 编译器会对代码进行检查,以确定没一次赋值,每一次方法的调用是符合类型的。如果有任何不相符合的情况, Java 编译器就会给出错误。
类型检查是基于这样一个简单的事实:每一变量的声明都给这个变量一个类型;每一个方法包括构造器的声明都给这个方法的特征。这样一来, Java 编译器可以对任何的表达式推断出一个明显类型, Java 编译器可以基于明显类型对类型进行检查。
Java 语言是类型安全的。这就是说,任何被 Java 编译器接受的合法的 Java 类保证是类型安全的。换言之,在程序运行期间,不会有任何类型的错误。一个 Java 程序根本不可能将一个本来属于一个类型的变量当作另一个类型处理,因此也就不会产生由此而引起的错误。
简单的说, Java 语言依靠三种机制做到了类型安全:编译期间的类型检查,自动的存储管理,数组的边界检查
http://java.ccidnet.com/art/3737/20051208/467875_1.html
澄清Java 语言接口与继承的本质
chensheng913
大多数人认为,接口的意义在于顶替多重继承。众所周知Java
没有c++
那样多重继承的机制,但是却能够实作多个接口。其实这样做是很牵强的,接口和继承是完全不同的东西,接口没有能力代替多重继承,也没有这个义务。接口的作用,一言以蔽之,就是标志类的类别(type of class
)。把不同类型的类归于不同的接口,可以更好的管理他们。OO
的精髓,我以为,是对对象的抽象,最能体现这一点的就是接口。为什么我们讨论设计模式都只针对具备了抽象能力的语言(比如c++
、java
、c#
等),就是因为设计模式所研究的,实际上就是如何合理的去抽象。(cowboy
的名言是“抽象就是抽去像的部分”,看似调侃,实乃至理)。
设计模式中最基础的是工厂模式(Factory
),在我最近的一个很简单的应用中,我想尽量的让我的程序能够在多个数据库间移植,当然,这涉及很多问题,单是如何兼容不同DBMS
的SQL
就让人头痛。我们不妨先把问题简单化,只考虑如何连接不同的数据库。
假设我有很多个类,分别是Mysql.java
、SQLServer.java
、Oracle.java
、DB2.java
,他们分别连接不同的数据库,统一返回一个Connection
对象,并且都有一个close
方法,用于关闭连接。只需要针对你的DBMS
,选择不同的类,就可以用了,但是我的用户他会使用什么数据库?我不知道,我希望的是尽量少的修改代码,就能满足他的需要。我可以抽象如下接口:
package org.bromon.test; |
这个接口只定义两个方法,没有任何有实际意义的代码,具体的代码由实作这个接口的类来给出,比如Mysql.java
:
Package org.bromon.test; |
类似的当然还有Oracle.java
等等,接口DB
给这些类归了个类,在应用程序中我们这样定义对象:
org.bromon.test.DB myDB;
使用myDB
来操作数据库,就可以不用管实际上我所使用的是哪个类,这就是所谓的“开-
闭”原则。但是问题在于接口是不能实例化的,myDB=new DB()
,这样的代码是绝对错误的,我们只能myDB=new Mysql()
或者myDB=new Oracle()
。麻烦了,我还是需要指定具体实例化的是哪个类,用了接口跟没用一样。所以我们需要一个工厂:
package org.bromon.test; |
所以实例化的代码变成:myDB=DBFactory.getConn()
;
这就是23
种模式中最基础的普通工厂(Factory)
,工厂类负责具体实例化哪个类,而其他的程序逻辑都是针对DB
这个接口进行操作,这就是“针对接口编程”。责任都被推卸给工厂类了,当然你也可以继续定义工厂接口,继续把责任上抛,这就演变成抽象工厂(Abstract Factory)
。
整个过程中接口不负责任何具体操作,其他的程序要连接数据库的话,只需要构造一个DB
对象就OK
,而不管工厂类如何变化。这就是接口的意义----
抽象。
继承的概念不用多说,很好理解。为什么要继承呢?因为你想重用代码?这绝对不是理由,继承的意义也在于抽象,而不是代码重用。如果对象A
有一个run()
方法,对象B
也想有这个方法,所以有人就Class B extends A
。这是不经大脑的做法。如果在B
中实例化一个A
,调用A
的Run()
方法,是不是可以达到同样的目的?如下:
Class B |
这就是利用类的聚合来重用代码,是委派模式的雏形,是GoF
一贯倡导的做法。
那么继承的意义何在?其实这是历史原因造成的,最开始的OO
语言只有继承,没有接口,所以只能以继承来实现抽象,请一定注意,继承的本意在于抽象,而非代码重用(虽然继承也有这个作用),这是很多Java
烂书最严重的错误之一,它们所造成的阴影,我至今还没有完全摆脱,坏书害人啊,尤其是入门类的,流毒太大。什么时候应该使用继承?只在抽象类中使用,其他情况下尽量不使用。抽象类也是不能实例化的,它仅仅提供一个模版而已,这就很能说明问题。
软件开发的万恶之源,一是重复代码而不是重用代码,二是烂用继承,尤以c++
程序员为甚。Java
中取缔多重继承,目的就是制止烂用继承,实是非常明智的做法,不过很多人都不理解。Java
能够更好的体现设计,这是让我入迷的原因之一。
http://www.java-asp.net/java/200511/t_44332.html
发表评论
-
如何获得JVM的最大可用内存
2010-06-26 17:47 2114在命令行下用 java -XmxXXXXM -version ... -
java程序的时间与系统时间不同
2010-04-15 21:43 1542实施软件时,windows时区、语言设置都正常,但java程序 ... -
java集合框架全面进阶
2009-05-22 20:07 1150java集合框架全面进阶 java集合框架全面进 ... -
Jsp+JavaBean教程
2009-05-22 18:50 3818按着Sun公司的定义,JavaBean是一个可重复使用的软件组 ... -
Java常用术语解释
2009-05-22 17:39 2333名词 解释 AAA ... -
Java面向对象概述
2009-05-22 17:23 1041(如今的程序领域,大家都在说,面向对象OOP,但是真正能理解 ... -
java入门与加深
2009-05-22 17:13 9551 什么是Java、Java2、JDK ... -
利用Java事件处理机制实现录制、回放功能
2009-05-22 17:04 1593利用Java事件处理机制实 ... -
数据类型
2009-05-22 17:00 1119【导读】Java 提供 ... -
java数据类型转换
2009-05-22 16:57 1184[收藏]java数据类型转换 一些初学JAVA ... -
Java异常学习心得
2009-05-22 16:47 1436Java 异常学习心得 本文重在 Java ... -
多线程
2009-05-22 16:26 2171JAVA 教程:解析Java 的多线程机制 ... -
哈希表
2009-05-22 16:23 1492哈希表的概念作用及意义,哈希表的构造方法 ... -
一个简单的SWT程序实例及详解
2009-05-22 16:04 1767网易学院 一个 ... -
String的比较
2009-05-22 15:34 1330关于java中的equals() 悬 ... -
JVM(JAVA虚拟机介绍)
2009-05-22 15:30 1222JVM(JAVA虚拟机介绍) 来 ... -
如果安装了JDK,会发同你的电脑有两套JRE
2009-05-22 15:29 1443如果安装了JDK,会发同 ... -
文件选择对话框,颜色选择对话框,分隔线的使用与介绍
2009-05-22 15:12 2664文件选择对话框,颜色选择对话框,分隔线的使用与介绍 ++ ... -
Java, JVM, JRE, Java API, Java类库, 编译器, 解释器,
2009-05-22 14:57 2525Java, JVM, JRE, Ja ... -
根据CLASSPATH环境变量定位类
2009-05-17 17:47 2344实际上,如果使用1.5以上版本的JDK,完全可以不用设置CLA ...
相关推荐
然而,对于C#调用Java接口,最常用且推荐的方法是使用`Java Native Interface (JNI)`,它允许Java代码调用本地(非Java)代码,并反之亦然。这里我们将使用IKVM.NET,这是一个开源项目,它实现了.NET运行时的Java...
Java API接口文档模板详解 Java API接口文档模板是Java初学者必须掌握的重要知识点之一。该文档模板提供了详细的接口输入输出定义,旨在帮助前后端开发人员快速了解和使用接口。下面我们将对该文档模板进行详细解释...
本资源"java程序各种常用方法集锦"正是为了解决这些问题而整理的一份综合性的代码库,包含了大量实用的代码示例。下面,我们将详细探讨这些关键知识点。 1. **集合操作**: - `ArrayList`与`LinkedList`:两种最...
在Java编程中,有一些常见的代码方法是每个开发者都需要掌握的。这些方法不仅提高了代码的可读性和可维护性,还能有效地解决日常编程问题。以下是一些关键的Java代码方法和相关知识点: 1. **字符串操作**: - `...
通过本篇内容,你将能够掌握一套全面的Java接口自动化测试实战策略。 首先,接口自动化测试整体认知是理解自动化测试的基础。它涉及到测试的目标、范围和价值,例如提高测试效率、降低人工错误和确保产品质量。接口...
Java Swing 常用事件和监听器接口 Java Swing 是一个功能强大的图形用户界面(GUI)工具包,它提供了许多事件和监听器接口,帮助开发者更好地处理用户交互。下面是 Java Swing 中常用的事件和监听器接口。 1. ...
`Runnable`接口只有一个`run()`方法,不返回结果;`Callable`接口有一个`call()`方法,可以返回结果。例如: ```java class MyTask implements Runnable { @Override public void run() { // 任务代码 } } `...
### Java常用方法集合 ...综上所述,`java.lang.*` 包中的常用方法和接口提供了强大的功能支持,帮助开发者高效地完成日常开发任务。无论是实现对象克隆、对象排序还是处理异常情况,这些工具都是不可或缺的基础。
在Java开发中,中间接口转发(Middleware Interface Forwarding)是一种常见的设计模式,它主要用于实现业务逻辑的解耦和系统的稳定性。这个DEMO展示了如何在Java中构建这样的中间层,以应对第三方API可能出现的问题...
在Java中,接口是一种完全抽象的类型,它只包含常量和抽象方法的声明,不包含任何实现。接口通过关键字`interface`定义,用以规定实现它的类必须具备哪些功能。接口可以看作是一种多继承的变体,一个类可以实现多个...
Java开发过程中,jar(Java Archive)包是必不可少的资源,它们包含了预编译的类、接口、资源文件等,使得开发者能够复用已有的代码库。"java常用jar包"这个主题涵盖了Java与数据库交互以及日志管理的核心库。这里...
在Java编程语言中,掌握常用方法对于提升编程效率和编写高效代码至关重要。这些方法涵盖了基本类型的操作、集合框架的使用以及数学运算等多个方面。本文将深入探讨Java中的常见方法,特别是与`List`, `Set`, `Map`...
在Java编程语言中,API(Application Programming Interface)是一组预定义的类、接口、方法和其他组件,它们提供了标准的方式来实现特定的功能。Java API是Java开发的核心组成部分,它为程序员提供了丰富的功能,...
Java API文档通常以Javadoc的形式存在,它详尽地解释了每一个类、方法和接口的功能,帮助开发者理解和使用这些组件。 在Java开发中,以下是一些常用API的知识点: 1. **集合框架**:Java集合框架是处理对象集合的...
下面我们将详细探讨Java AWT中的常见事件、监听器接口及其方法。 1. **ActionEvent** 和 **ActionListener**: - `ActionEvent`:当用户进行了一项操作,如点击按钮、选择菜单项时,会触发此类事件。 - `...
在Java环境中,OpenCV提供了Java接口,使得Java开发者也能利用其丰富的功能。在标题提到的"opencv的java接口和win库"中,主要包含两个核心组件:`opencv-340.jar`和`opencv_java340.dll`。 1. **opencv-340.jar**:...
在Java开发中,工具类是程序员经常会用到的代码库,它们提供了许多便捷的方法,以简化常见的编程任务。本文将详细解析"java开发常用工具类"中的关键知识点,包括日历、时间处理、Excel导出、网络请求、流操作、数据...
这份“JAVA常用API文档 中文完整版”包含了Java平台标准版(Java SE)的所有核心API,是Java开发者的重要参考资料。 在Java API文档中,我们可以找到关于Java语言的基本类、集合框架、网络编程、多线程、I/O流、...
Java的诞生对软件产业产生了深远影响,它推动了分布式计算模式、基于构建的开发方法和多层应用体系结构,如CORBA和后来的Java 2平台与.NET平台的竞争。此外,Java促进了软件从开发中心向服务中心的转变,强调软件的...