欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 资讯 > Java 接口与实现

Java 接口与实现

2025/1/8 8:12:54 来源:https://blog.csdn.net/xinfanyyds/article/details/144990145  浏览:    关键词:Java 接口与实现

目录

1.Java接口

2.Java实现接口

3.Java接口回调

4.Java接口与多态

5.Java接口参数 

6.Java接口与抽象类的比较 

7.Java接口的UML图 


1.Java接口

接口是Java语言中一种重要的数据类型,通常使用关键字interface来定义一个接口。

接口的定义和类的定义十分相似,分为接口声明和接口体,例如:

interface Printable {final int MAX=100;void add();float sum(float x,float y);
}

1. 接口声明:

接口包含有接口声明和接口体,和类不同的是,接口使用关键字interface来声明自己是一个接口,格式如下:

interface 接口的名字

2.接口体:

接口体中包含常量的声明和抽象方法两部分。接口体中只有抽象方法,没有普通方法,而且接口体中所有的常量的访问权限一定都是public,而且是static常量,所有的抽象方法的访问权限一定都是public。

例如:

interface Printable {public final static int MAX = 100; //等价写法:int MAX = 100;public abstract void add(); //等价写法:void add();public abstract float sum(float x,float y);//等价写法:float sum(float x,float y);
}

注意:修饰符public、final、static允许省略。

2.Java实现接口

在Java语言中,接口由类来实现,以便使用接口中的方法。一个类需要在类声明中使用关键字implements声明该类实现一个或多个接口。如果实现多个按口,用逗号隔开接口名。

例如:

class A implements Printable,Addable //A类实现Printable和Addable接口
class Dog extends Animal implements Eatable,Sleepable
//Animal的Dog子类实现Eatable和Sleepable接口

如果一个非抽象类实现了某个接口,那么这个类必须重写这个接口中的所有方法。

注意:由于接口中的方法一定是public abstract方法,所以类在重写接口方法时不仅要去掉abstract修饰符,还要给出方法体,而且方法的访问权限一定要明显地用public来修饰。

如果实现接口的非抽象类实现了该接口中的方法,就相当于给出了方法的具体行为功能。用户也可以自定义接口,一个Java源文件可以由类和接口组成。

如果一个类声明实现一个接口,但没有重写接口中的所有方法,那么这个类必须是抽象类,也就是说,抽象类既可以重写接口中的方法,也可以直接拥有接口中的方法。

细节说明:

程序可以用接口名访问接口中的常量,但是如果一个类实现了接口,那么该类可以直接在类体中使用该接口中的常量。

定义接口时,如果关键字interface前面加上public关键字,就称作public接口,public接口可以被任何一个类实现;如果不加上public关键字,就称作友好接口,友好接口可以被与该接口在同一包中的类实现。

如果父类实现了某个接口,那么子类也就自然而然地实现了该接口,也就是说,子类不必再使用关键字implements声明实现这个接口。

接口也是可以被继承的,即可以通过关键字extends声明一个接口是另一个接口的子接口。由于接口中的方法和常量都是共有的,所以子接口将继承父接口中的全部方法和常量。

注意:Java提供的接口都在相应的包中,通过import语句不仅可以引入包中的类,也可以引入包中的接口。

例如:

import java.io.*;
//此时不仅引入了java.io包中的类,还引入了该包中的接口

3.Java接口回调

接口和类一样,也是Java语言中一种重要的数据类型,用接口声明的变量称作接口变量,那么接口变量中可以存放什么样的数据呢?

首先,接口属于引用型变量,接口变量中可以存放实现该接口的类的实例的引用,即存放对象的引用。

例如:假设Com是一个接口,那么就可以用Com声明一个变量。

Com com;

因为com变量中还没有存放实现该接口的对象的引用,所以称此时的com是一个空接口

假设ImpleCom类是实现Com接口的类,用ImpleCom创建名字为object的对象,那么object对象不仅可以调用ImpleCom类中原有的方法,而且也可以调用ImpleCom类实现的接口方法。

ImpleCom object = new ImpleCom();

接口回调”一词的来源:

该词借用了C语言中指针回调的术语,表示一个变量的地址在某一个时刻存放在一个指针变量中,那么指针变量就可以间接操作该变量中存放的数据。

在Java语言中,接口回调是指可以把实现某一接口的类创建的对象的引用赋值给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口方法,实际上,当接口变量调用被类实现的接口方法时,就是通知相应的对象调用这个方法。

注意:接口无法调用类中的其他非接口方法。

4.Java接口与多态

由于不同的类在实现同一个接口时可能具有不同的实现方式,所以接口变量在回调接口方法时就可能具有多种形态

接口多态定义的格式:

接口 变量名 = new 接口实现类();

例如:A类和B类都实现了ComputerAverage接口,但实现的方式不同。 

interface ComputerAverage {public double average(double a,double b);
}
class A implements ComputerAverage {public double average(double a,double b) {double aver = 0;aver = (a+b)/2;return aver;}
}
class B implements ComputerAverage {public double average(double a,double b) {double aver = 0;aver = Math.sqrt(a*b);return aver;}
}
public class Main {public static void main(String args[]) {ComputerAverage computer;double a = 10,b = 40;computer = new A();double result = computer.average(a,b);System.out.printf("%5.2f和%5.2f的算术平均值:%5.2f\n",a,b,result);computer = new B();result = computer.average(a,b);System.out.printf("%5.2f和%5.2f的几何平均值:%5.2f",a,b,result);}
}

运行结果如下:

10.00和40.00的算术平均值:25.00
10.00和40.00的几何平均值:20.00

5.Java接口参数 

如果准备给一个方法的参数传递一个数值,你可能希望该方法的参数的类型是double类型,这样一来就可以向该参数传递byte、int、long、float和double类型的数据。

如果一个方法的参数是接口类型,我们就可以将任何实现该接口的类的实例的引用传递给该接口参数,那么接口参数就可以回调类实现的接口方法
例如:

interface SpeakHello {void speakHello();
}
class Chinese implements SpeakHello {public void speakHello() {System.out.println("中国人习惯问候语:你好,吃饭了吗? ");}
}
class English implements SpeakHello {public void speakHello() {System.out.println("英国人习惯问候语:你好,天气不错!");}
}
class KindHello {public void lookHello(SpeakHello hello) { //接口类型参数hello.speakHello(); //接口回调}
}
public class Main {public static void main(String args[]) {KindHello kindHello = new KindHello();kindHello.lookHello(new Chinese());kindHello.lookHello(new English());}
}

运行结果如下:

中国人习惯问候语:你好,吃饭了吗?
英国人习惯问候语:你好,天气不错!

注意:如果源文件再增加若干个类似Chinese和English的类,KindHello类不需要做任何修改。

6.Java接口与抽象类的比较 

1. Java接口与抽象类的比较

(1) abstract(抽象)类和接口都可以有abstract(抽象)方法。

(2) 接口中只可以有常量,不能有变量,而abstract类中既可以有常量也可以有变量。

(3) abstract类中也可以有非abstract方法,接口不可以。

在设计程序时应当根据具体的分析来确定是使用抽象类还是接口。abstract类除了提供重要的需要子类重写的abstract方法以外,还提供了子类可以继承的变量和非abstract方法。

如果某个问题需要使用继承才能更好地解决,比如:子类除了需要重写父类的abstract方法以外,还需要从父类继承一些变量或继承一些重要的非abstract方法,就可以考虑用abstract类。如果某个问题不需要继承,只是需要若干个类给出某些重要的abstract方法的实现细节,就可以考虑使用接口。

注意:JDK1.8接口支持静态方法和默认方法。

2. JDK1.8之前接口的定义和限制

1)接口不能用于实例化对象。

2)接口没有构造方法。

3)接口中所有的方法必须是抽象方法。

4)接口不能包含成员变量,除了static和final变量。

5)接口不是被类继承,而是要被类实现。

6)接口支持多继承。

默认方法就是接口可以有实现方法且不需要实现类去实现其方法,只需要在方法名前面加上default关键字即可实现默认方法。默认方法提供了一种扩展接口的方法,而且还不会破坏现有代码。

3. 注意事项

(1) 接口默认方法、静态方法可以有多个。

(2) 默认方法通过实例调用,静态方法通过接口名调用。

(3) default关键字只能用在接口中。

(4) 默认方法可以被继承,如果继承多个接口,多个接口都定义多个同样的默认方法,实现类需要重写默认方法,不然会报错。

(5) 静态方法不能被继承和覆盖,所以只能被具体所在的接口调用。

注意:JDK1.9以后,允许将方法定义为private,使得某些复用的代码不会把方法暴露出去。

7.Java接口的UML图 

表示接口的UML图和表示类的UML图类似,使用一个长方形描述一个接口的主要构成,将长方形垂直地分为三层。

顶部第1层是名字层,接口的名字必须是斜体字形,而且需要用<<interface>>修饰名字,并且该修饰和名字分列在两行。

第2层是常量层,列出接口中的常量及类型,格式是“常量名字:类型”。

第3层是方法层,也称操作层,列出接口中的方法及返回类型,格式是“方法名字(参数列表):类型”。

接口Computable的UML图如下:

Java接口的UML图1

如果一个类实现了一个接口,那么类和接口的关系是实现关系,称类实现接口。UML通过使用虚线连接类和它所实现的接口,虚线起始端是类,虚线的终点端是它实现的接口,但终点端使用一个空心的三角形表示虚线的结束。

China和Japan类实现Computable接口的UML图如下:

Java接口的UML图2

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com