零基础java自学流程-Java语言进阶42

本文深入探讨了Java接口的概念,强调其作为方法特征集合的角色,以及如何通过接口实现多继承。接口不包含实现,只能声明抽象方法和常量。讨论了单方法接口和标识接口的用法,同时对比了接口与抽象类的区别。Java接口提供了类的可插入性和灵活性,对于大型、长期项目的可维护性至关重要。文章还给出了实现接口的示例代码,展示了如何定义和使用接口。

java接口

Java接口是一系列方法的声明,是方法特征的集合。接口只有方法的特征,但没有方法的实现。因此,这些方法可以由不同的类在不同的地方实现,并且这些实现可以具有不同的行为(功能)。

Java接口:Java语言中存在的结构,具有特定的语法和结构。其次,类的方法集合是逻辑抽象。前者称为“Java接口”,后者称为“接口”。

在Java语言规范中,方法的特征只包括方法的名称、参数的数量和类型,而不包括方法的返回类型、参数的名称和抛出的异常。当Java编译器检查重载方法时,它根据这些条件确定两个方法是否重载。但是当Java编译器检查方法替换时,它会进一步检查两个方法(超类型和子类型)的返回类型和抛出的异常是否相同。

接口实现和类继承规则,为了数据安全,一个类只能直接继承一个父类,即单一继承,但一个类可以实现多个接口,而接口弥补了一个类的不多重继承,继承和接口设计是为了保持一个类的数据安全或伪装实现多重继承。

Java接口本身没有任何实现,而且因为Java接口不处理表示,而只是描述公共行为,所以它们比Java抽象类更抽象。但是接口不是类,而且不能使用new操作符实例化接口。例如x=new comparable (......);//这是一个错误。但是你可以声明接口变量Comparable X;//这是允许的。

Java接口方法只能是抽象的和公共的,Java接口不能有构造函数,Java接口可以有公共的、静态的和最终的属性。Public static final int value=5;

接口将方法的特征与其实现分开。这种划分反映在以下事实中:接口通常代表一个角色,包装与该角色关联的操作和属性,实现接口的类是扮演该角色的参与者。一个角色由不同的演员扮演,不同的演员除了扮演共同的角色外,不需要有任何共同之处。

两个类中的两个相似函数动态地调用它们的类,它们决定了一个实现,提供了一个抽象超类,而子类实现了超类定义的方法。

问题出现了:Java是一种单继承语言。通常,哪个特定的类可能已经有一个超类,可以通过将超类添加到它的父类或将超类添加到它的父类来解决,直到它移动到类层次结构的顶部。因此,设计特定类的可插入性就变成了对层次结构中所有类的修改。

可以插入性

层次结构中的任何类都可以实现影响该类的所有子类的接口,但不影响该类的任何超类。这些必须意识到这种方法所描述的接口,和它的子类可以自动从此类继承这些方法,当然,也可以选择从所有的这些方法,或者其中的一些方法,在那个时候,子类有可插拔(你可以使用这个接口类型的负载,转移实现了他所有的子类)。

我们关心的不是特定的类,而是类是否实现了我们需要的接口。

该接口提供关联和方法调用的可互连性。软件系统越大,其生命周期越长。该接口保证了软件系统的灵活性、可扩展性和可互连性。

类型

使用Java接口来耦合内部和外部的软件单元。使用非具体类的Java接口来声明变量类型、方法返回类型、参数类型声明和数据类型转换。

理想情况下,具体的Java类应该只实现抽象Java类中声明的Java接口和方法,不应该提供多余的方法。

层次结构

Java接口(和抽象类)通常用作类型层次结构的起点。

如果一个类已经有一个主超类型,那么通过实现接口,该类可以有另一个称为混合类型的辅助超类型。

单方法接口

以下是引用片段:

public interface Actionlistener{
public abstract void actionPerformed(ActionEvent event);
}

只有一个方法,而且只有实现了这个接口(覆盖这个接口中的唯一方法),您才能注册事件侦听器列表(参数Actionlistener类型),以便在事件源更改时自动调用惟一的actionPerformed方法。

确定接口

是一个没有任何方法或属性的接口。标识一个接口对实现它的类没有任何语义要求;它只是表明实现它的类属于特定类型(传递型)。

不建议过多使用标识接口。

常量接口

Java接口用于声明常量,然后由实现接口的类使用这些常量(我们在前面的画板中这样做了)。不建议模拟这种常量接口方法。

定义接口格式

[public]interface 接口名称 [extends父接口名列表]
{
//静态常量
[public] [static] [final] 数据类型变量名=常量值;
//抽象方法
[public] [abstract] [native] 返回值类型方法名(参数列表);
}

实现接口格式

[修饰符] class 类名[extends 父类名] [implements 接口A,接口B,···]
{
类成员变量和成员方法;
为接口A中的所有方法编写方法体,实现接口A;
为接口B中的所有方法编写方法体,实现接口B;
}

实例:

本例定义接口AreaInterface,其中有静态常量pai和求面积的抽象方法area()。类Circle和类Rectangle实现了AreaInterface接口,即为接口中的抽象方法area()编写了满足各自要求的方法体,分别求圆形和长方形的面积。

程序:AreaInterface.java

package intrFace;
public interface AreaInterface{
double pai=Math.PI;
double area();
}

程序:Circle.java

package intrFace;
public class Circle implements AreaInterface{
double r;
public Circle(double x){
r=x;
}
//实现接口中的抽象方法,求圆面积
public double area(){
return pai * r * r;
}
public String toString(){
return "圆:r="+r+"\tarea="+area();
}
}

程序:Rectangle.java

package intrFace;
public class Rectangle implements AreaInterface{
double x,y;
public Rectangle(double a,double b){
x=a;
y=b;
}
public double area()//实现接口中的抽象方法,求长方形面积
{
return x * y;
}
public String toString()
{
return "长方形:x="+x+";y="+y+"\t"
area=+area();
}
}

Java接口和Java抽象类最大的一个区别,就在于Java抽象类可以提供某些方法的部分实现,而Java接口不可以,这大概就是Java抽象类唯一的优点吧,但这个优点非常有用。如果向一个抽象类里加入一个新的具体方法时,那么它所有的子类都一下子都得到了这个新方法,而Java接口做不到这一点,如果向一个Java接口里加入一个新方法,所有实现这个接口的类就无法成功通过编译了,因为你必须让每一个类都再实现这个方法才行,这显然是Java接口的缺点。

一个抽象类的实现只能由这个抽象类的子类给出,也就是说,这个实现处在抽象类所定义出的继承的等级结构中,而由于Java语言的单继承性,所以抽象类作为类型定义工具的效能大打折扣。在这一点上,Java接口的优势就出来了,任何一个实现了一个Java接口所规定的方法的类都可以具有这个接口的类型,而一个类可以实现任意多个Java接口,从而这个类就有了多种类型。

不难看出,Java接口是定义混合类型的理想工具,混合类表明一个类不仅仅具有某个主类型的行为,而且具有其他的次要行为。

在语法上,抽象类和接口有着以下不同:

1.abstract class在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。 继承抽象类使用的是extends关键字,实现接口使用的是implements关键字,继承写在前面,实现接口写在后面。如果实现多个接口,中间用逗号分隔。例:

1

public class Main extends JApplet

1

public class Main implements Runnable

1

public class Main extends JApplet implements ActionListener

public class Main extends JApplet implements ActionListener, Runnable

2.在abstract class中可以有自己的数据成员,也可以有非abstract的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。

3.abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。

4.实现接口的类必须实现其中的所有方法,继承自抽象类的子类实现所有的抽象方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。

5.接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。

6.抽象类中的变量默认具有 friendly权限,其值可以在子类中重新定义,也可以重新赋值。

7.接口中的方法默认都是 public abstract 类型的。


想要系统学习JAVA推荐JAVA300集

Java300集零基础适合初学者视频教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值