Java接口
1 什么Java接口
Java中的接口是类的蓝图。接口包含静态常量和抽象方法。
Java中的接口是一种实现抽象的机制。Java接口中只能有抽象方法,而不能有方法实现。接口用于在Java中实现抽象和多重继承。
- Java接口还表示IS-A关系。
- 与抽象类类似,Java接口也是不能实例化的。
- 从Java 8开始,我们可以在接口中使用默认方法和静态方法。
- 从Java 9开始,我们可以在接口中使用私有方法。
2 为什么要使用Java接口
使用接口的主要原因主要有以下三个:
- 接口用于实现抽象。
- 通过接口,我们可以支持多重继承的功能。
- 接口可用于降低系统耦合。
3 如何定义接口
使用interface关键字声明接口。接口提供了全面的抽象;表示接口中的所有方法都没有方法体,并且默认情况下所有字段均为public,static和final。实现接口的类必须实现接口中声明的所有方法。
interface <interface_name>{
// 声明常量字段
// 声明抽象方法
}
4 编译器编译接口的细节
Java编译器在编译接口的时候,在接口所有方法之前自动添加了public关键字和abstract关键字。此外,它在字段之前也自动添加了public,static和final关键字。
换句话说,默认情况下,接口的所有字段是public,static和final,而方法是public和abstract的。
5 类和接口的关系
如下图所示,一个类继承另一个类,一个接口继承另一个接口,但是一个类可以实现接口。
6 Java接口的示例:Printable
在本示例中,Printable接口只有一个方法,并且其实现在A6类中提供。
/**
* 一点教程网 - http://www.yiidian.com
*/
interface printable{
void print();
}
class A6 implements printable{
public void print(){
System.out.println("你好");
}
public static void main(String args[]){
A6 obj = new A6();
obj.print();
}
}
输出结果为:
你好
7 Java接口的示例:Drawable
在本示例中,Drawable接口只有一个方法。它的实现由Rectangle和Circle类提供。在实际情况下,接口是由其他人定义的,但是其实现是由不同的实现提供程序提供的。而且,它被其他人使用。使用该接口的用户将实现部分隐藏起来。
TestInterface1.java:
/**
* 一点教程网 - http://www.yiidian.com
*/
//接口声明
interface Drawable{
void draw();
}
//其他人实现了接口的内容
class Rectangle implements Drawable{
public void draw(){System.out.println("绘制长方形");}
}
class Circle implements Drawable{
public void draw(){System.out.println("绘制圆形");}
}
//另一个用户编写测试程序来测试接口和实现类是否可用
class TestInterface1{
public static void main(String args[]){
Drawable d=new Circle();//在实际情况下,对象由方法提供,例如getDrawable()
d.draw();
}
}
输出结果为:
绘制圆形
8 Java接口的示例:Bank
让我们看一下Java接口的另一个示例,该示例提供Bank接口的实现。
TestInterface2.java:
/**
* 一点教程网 - http://www.yiidian.com
*/
interface Bank{
float rateOfInterest();
}
class ICBC implements Bank{
public float rateOfInterest(){return 9.15f;}
}
class CCB implements Bank{
public float rateOfInterest(){return 9.7f;}
}
class TestInterface2{
public static void main(String[] args){
Bank b=new ICBC();
System.out.println("贷款利率为: "+b.rateOfInterest());
}
}
输出结果为:
贷款利率为: 9.15
9 Java接口继承
一个类实现一个接口,但是一个接口继承另一个接口。
/**
* 一点教程网 - http://www.yiidian.com
*/
interface Printable{
void print();
}
interface Showable extends Printable{
void show();
}
class TestInterface4 implements Showable{
public void print(){
System.out.println("你好");
}
public void show(){
System.out.println("欢迎");
}
public static void main(String args[]){
TestInterface4 obj = new TestInterface4();
obj.print();
obj.show();
}
}
输出结果为:
你好
欢迎
10 Java接口的多重继承
如果一个类实现多个接口,或者一个接口扩展了多个接口,则称为多重继承。
/**
* 一点教程网 - http://www.yiidian.com
*/
interface Printable{
void print();
}
interface Showable extends Printable{
void show();
}
class TestInterface4 implements Showable{
public void print(){
System.out.println("你好");
}
public void show(){
System.out.println("欢迎");
}
public static void main(String args[]){
TestInterface4 obj = new TestInterface4();
obj.print();
obj.show();
}
}
输出结果为:
你好
欢迎
11 为什么类不支持多重继承,接口支持多重继承
正如我们在继承章节中所讲的,由于类的歧义,Java的类是不支持多重继承的。但是,Java的接口是支持多重继承,这是因为接口的实现是由实现类提供的,不存在歧义的问题。例如:
/**
* 一点教程网 - http://www.yiidian.com
*/
interface Printable{
void print();
}
interface Showable{
void print();
}
class TestInterface3 implements Printable, Showable{
public void print(){
System.out.println("你好");
}
public static void main(String args[]){
TestInterface3 obj = new TestInterface3();
obj.print();
}
}
输出结果为:
你好
上面的示例中我们可以看到,Printable和Showable接口拥有相同的方法,但其实现由TestTnterface1提供,因此没有歧义。
12 Java8接口的默认方法
从Java 8开始,我们可以在接口中存在方法实现。但是我们需要将其设置为默认方法。让我们来看一个例子:
TestInterfaceDefault.java:
/**
* 一点教程网 - http://www.yiidian.com
*/
interface Drawable{
void draw();
default void msg(){
System.out.println("默认方法");
}
}
class Rectangle implements Drawable{
public void draw(){
System.out.println("绘制长方形");
}
}
class TestInterfaceDefault{
public static void main(String args[]){
Drawable d=new Rectangle();
d.draw();
d.msg();
}
}
输出结果为:
绘制长方形
默认方法
13 Java8接口的静态方法
从Java 8开始,我们可以在接口中使用静态方法。让我们来看一个例子:
TestInterfaceStatic.java:
/**
* 一点教程网 - http://www.yiidian.com
*/
interface Drawable{
void draw();
static int cube(int x){
return x*x*x;
}
}
class Rectangle implements Drawable{
public void draw(){
System.out.println("绘制长方形");
}
}
class TestInterfaceStatic{
public static void main(String args[]){
Drawable d=new Rectangle();
d.draw();
System.out.println(Drawable.cube(3));
}}
输出结果为:
绘制长方形
27
14 什么是标记接口
没有任何成员(字段或者方法)的接口称为标记接口,例如Serializable,Cloneable,Remote等。它们用于向JVM提供一些基本信息,以便JVM可以执行一些有用的操作。
//所有需要序列化的对象都必须实现Serializable接口
public interface Serializable{
}
热门文章
优秀文章