接口、接口实现、 接口方法、接口示例(Java)

接口、接口实现、 接口方法、接口示例

接口的定义
接口声明使用interface关键字,interface后面跟接口名称,当然接口也可以继承接口。

//接口名称通常是able结尾
public interface Eatable {
//接口中抽象方法只有声明,没有实现
public abstract String howToEat() ;
}

实现接口就是实现接口定义的抽象方法,需要在类声明中用implements子句来实现接口。一个类可以实现多个接口。

public class Qrange implements Eatable{
@Override
//实现抽象方法的方法不是抽象方法
public String howToEat() {
return "Make Orange juice" ;
}
}

接口的继承
一个接口可以继承一个或多个接口,接口的继承使用extends关键字。而一个类只能继承自一个类。定义一个AA,一个BB和一个CC接口。让CC接口继承AA和BB接口的方法和常量,当然CCC接口中也可以定义常量和方法。
通过DD类来实现CC接口。

public interface AA {
int STATUS = 100 ;
public abstract void display() ;
}

public interface BB {
public abstract void show() ;
public default void print() {
System.out.println("这是BB接口默认的方法") ;
}
}

public interface CC extends AA, BB{
int NUM = 3 ;
}

//实现CC接口,就要实现CC接口从AA和BB接口继承而来的方法
public class DD implements CC {
public void display() {
System.out.println("实现AA的display方法");
}
public void show() {
System.out.println("实现BB的show方法") ;
}
public static void main(String[] args) {
DD dd = new DD() ;
System.out.println(DD.STATUS);
dd.show() ;//调用CC接口从BB接口继承的抽象方法
dd.display() ;//调用CC接口从AA接口中调用的抽象方法
dd.print(); //调用CC接口从BB接口中继承的默认方法
}
}

运行结果如下图所示:
在这里插入图片描述
一个类AB同时实现AA和BB两个接口,代码如下:

//一个类AB要想实现多个接口,就要实现就要实现接口中定义的所有抽象方法
public class AB implements AA, BB{
public void display() {
System.out.println("实现AA的display方法");
}
public void show() {
System.out.println("实现BB的show方法") ;
}
public static void main(String[] args) {
AB ab = new AB() ;
System.out.println(AB.STATUS) ;
ab.display();
ab.show() ;																										
}
}

常量
定义在接口中的任何变量都是自动加上public,final,static属性,因此它们都是常量,常量的定义可以省略修饰符。

静态方法
在Java8中,可以在接口中定义静态方法,定义静态方法常用static关键字,默认的访问修饰符为public。
接口中的静态方法不能被子类继承,也不能实现类继承,接口中的方法使用“接口名.方法名()”的形式访问,该静态方法在哪个接口中定义,就使用哪个接口名。
下面我们看一个例子,创建一个SS类,通过接口类名直接调用此静态方法。

public interface SS {
int STATUS = 100 ;
//此静态方法不能被接口类继承,也不能被实现类实现
public static void display() {
System.out.println(STATUS);
}
public static void main(String[] args) {
SS.display(); //接口名访问display方法
}
}

默认方法
可以给接口中任何方法提供一个默认实现,这成为默认方法(default method),默认方法需要使用default关键字来定义。
默认方法可以被子接口和实现类继承,但子接口中若定义相同的默认方法,父接口的默认方法就会被隐藏。默认方法需要引用变量调用。

解决默认方法的冲突
如果一个类实现了两个接口,其中一个接口有个默认方法,另一个接口也有一个名称和参数类型相同的方法(默认方法或非默认方法),此时将产生冲突。
下面我们看一个例子,定义一个名为Person和一个名为Identified的接口,在两个接口在都有名为getID的默认方法,当在类中实现此方法的时候会发生冲突,此时解决冲突的方法有两种,一种是在类中自定义一个名为getID方法,另一种是指定调用哪个接口中的默认方法。

public interface Person {
public String getName() ;
public default int getID() {
return 0 ;
}
}
public interface Identified {
public default int getID() {
return Math.abs(hashCode()) ;
}
}
//如果类和接口中有同名的方法,类中的方法优先
public class Employee implements Person, Identified{
String name ;
@Override //重写抽象方法
public String getName() {
return this.name ;
}
//定义一个新的实现去解决继承的默认方法相同名称的冲突问题
/*
public int getID() {
return 100 ;
}
*/
//定义默认方法为指定接口的方法也可以解决冲突
public int getID() {
return Identified.super.getID() ;
}
}

接口示例
主要介绍两个接口,分别为Comparable接口和comparator接口。
要想比较实例对象的大小,或者排序,可以实现comparable接口。
下面我们看一下具体的例子。

import java.util.Arrays;
//实现comparable接口中的compareTo方法,进而去比较两个对象的大小
public class Circle implements Comparable<Circle>{
private double radius ;
public Circle() {}
public Circle(double radius) {
this.radius = radius ;
}
public double getArea() {
return Math.PI * radius * radius ;
}
public double getPerimeter() {
return 2 * Math.PI * radius ;
}
public int compareTo(Circle circle) {
if(getArea() > circle.getArea()) {
return 1 ;
}
else if(getArea() < circle.getArea()) {
return -1 ;
}
else {
return 0 ;
}
}
public static void main(String[] args) {
Circle c1 = new Circle(15) ;
Circle c2 = new Circle(20) ;
System.out.println(c1.compareTo(c2)) ;
//多个对象进行排序
Circle [] circles = new Circle[] {
new Circle(2.5), new Circle(3.3), new Circle(4.4)
};
//由小到大排序
Arrays.sort(circles);
//增强for循环打印输出
for (Circle c : circles) {
System.out.printf("%6.2f",c.getArea());
}
}
}

运行结果如下:
在这里插入图片描述
使用comparator接口实现比较字符串的大小,下面我们来看一个具体的示例。

import java.util.* ;
public class ComparableDemo {
public static void main(String[] args) {
String [] s = {"this", "is", "java", "string"} ;
//通过匿名内部类实现
Arrays.sort(s,new Comparator<String>() {
public int compare (String first, String  second) {
return first.length() - second.length() ;
}
}) ;
for(String s1 : s) {
System.out.print(s1 + " ") ;
}
}
}

运行结果如下:
在这里插入图片描述
如果我的文章对你有用的话,那就点的赞再走吧,谢谢!

发布了41 篇原创文章 · 获赞 20 · 访问量 6682

猜你喜欢

转载自blog.csdn.net/nuist_NJUPT/article/details/104866615
今日推荐