Java接口常用方法

 

接口是实现构件可插入性的关键,可插入构件的关键在于存在一个公用的接口,以及每个构件实现了这个接口。

  什么是接口?

      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++javac# 等),就是因为设计模式所研究的,实际上就是如何合理的去抽象。(cowboy 的名言是“抽象就是抽去像的部分”,看似调侃,实乃至理)。

  设计模式中最基础的是工厂模式(Factory ),在我最近的一个很简单的应用中,我想尽量的让我的程序能够在多个数据库间移植,当然,这涉及很多问题,单是如何兼容不同DBMSSQL 就让人头痛。我们不妨先把问题简单化,只考虑如何连接不同的数据库。

  假设我有很多个类,分别是Mysql.javaSQLServer.javaOracle.javaDB2.java ,他们分别连接不同的数据库,统一返回一个Connection 对象,并且都有一个close 方法,用于关闭连接。只需要针对你的DBMS ,选择不同的类,就可以用了,但是我的用户他会使用什么数据库?我不知道,我希望的是尽量少的修改代码,就能满足他的需要。我可以抽象如下接口:

package org.bromon.test;
public interface DB
{
  java.sql.Connection openDB(String url,String user,String password);
  void close();
}


  这个接口只定义两个方法,没有任何有实际意义的代码,具体的代码由实作这个接口的类来给出,比如Mysql.java

Package org.bromon.test;
import java.sql.*;
public class Mysql implements DB
{
  private String url=jdbc:mysql:localhost:3306/test;
  private String user=root;
  private String password= ””;
  private Connection conn;
  public Connection openDB(url,user,password)
  {
    // 连接数据库的代码
  }

  public void close()
  {
    // 关闭数据库
  }
}


  类似的当然还有Oracle.java 等等,接口DB 给这些类归了个类,在应用程序中我们这样定义对象:

  org.bromon.test.DB myDB;

  使用myDB 来操作数据库,就可以不用管实际上我所使用的是哪个类,这就是所谓的“开- 闭”原则。但是问题在于接口是不能实例化的,myDB=new DB() ,这样的代码是绝对错误的,我们只能myDB=new Mysql() 或者myDB=new Oracle() 。麻烦了,我还是需要指定具体实例化的是哪个类,用了接口跟没用一样。所以我们需要一个工厂:

package org.bromon.test;
public class DBFactory
{
  public static DB Connection getConn()
  {
    Return(new Mysql());
  }
}


  所以实例化的代码变成:myDB=DBFactory.getConn()

  这就是23 种模式中最基础的普通工厂(Factory) ,工厂类负责具体实例化哪个类,而其他的程序逻辑都是针对DB 这个接口进行操作,这就是“针对接口编程”。责任都被推卸给工厂类了,当然你也可以继续定义工厂接口,继续把责任上抛,这就演变成抽象工厂(Abstract Factory)

  整个过程中接口不负责任何具体操作,其他的程序要连接数据库的话,只需要构造一个DB 对象就OK ,而不管工厂类如何变化。这就是接口的意义---- 抽象。

  继承的概念不用多说,很好理解。为什么要继承呢?因为你想重用代码?这绝对不是理由,继承的意义也在于抽象,而不是代码重用。如果对象A 有一个run() 方法,对象B 也想有这个方法,所以有人就Class B extends A 。这是不经大脑的做法。如果在B 中实例化一个A ,调用ARun() 方法,是不是可以达到同样的目的?如下:

Class B
{
  A a=new A();
  a.run();
}


  这就是利用类的聚合来重用代码,是委派模式的雏形,是GoF 一贯倡导的做法。

  那么继承的意义何在?其实这是历史原因造成的,最开始的OO 语言只有继承,没有接口,所以只能以继承来实现抽象,请一定注意,继承的本意在于抽象,而非代码重用(虽然继承也有这个作用),这是很多Java 烂书最严重的错误之一,它们所造成的阴影,我至今还没有完全摆脱,坏书害人啊,尤其是入门类的,流毒太大。什么时候应该使用继承?只在抽象类中使用,其他情况下尽量不使用。抽象类也是不能实例化的,它仅仅提供一个模版而已,这就很能说明问题。

  软件开发的万恶之源,一是重复代码而不是重用代码,二是烂用继承,尤以c++ 程序员为甚。Java 中取缔多重继承,目的就是制止烂用继承,实是非常明智的做法,不过很多人都不理解。Java 能够更好的体现设计,这是让我入迷的原因之一。

http://www.java-asp.net/java/200511/t_44332.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值