目录
前言:
Java中的接口不是类,而是类的一组需求表述,这些类要遵从接口的统一格式进行定义.我们经常听到服务器厂商这么说:"如果类遵从某个特定的接口,那么就履行这项服务,下面给出一个具体的示例.Arrays类中的sort方法承诺可以对对象的数组进行排序,但要求满足下列前提:对象所属的类必须实现了Comparable接口.
另外,在接口中不能有非静态常量域的出现,对于域来说只能有 public static final int a = 10;这样的形式出现,就算你没有写权限和静态以及final关键字,编译器也会自动给你添加上去.
一、通过instanof判断是否实现了某接口
在继承中,我们学过可以通过instanceof关键字判断一个类是否是另一个类的派生类(子类),同样的,在接口中,同样可以使用instanceof判断一个类是否引用了一个接口.
package com.qcby;
/**
* @Author: ssm
* @Date: 2019/7/5 9:09
*/
public class TestMain {
public static void main(String[] args) {
TestInteface testInteface = new TestInteface();
if(testInteface instanceof Comparable){
System.out.println("实现了Comparable接口");
}else{
System.out.println("没有实现Comparable接口");
}
}
}
class TestInteface implements Comparable{
@Override
public int compareTo(Object o) {
return 0;
}
}
结果为实现了Comparable接口.
我们先来看怎么写一个接口:
public interface Human{
void run();//每一个人类都会跑
void yell();//每一个人类都会叫
}
在java1.8之前,接口中只能声明方法,不能写方法的实例化.但是在Java1.8以后对接口加入了静态方法和默认方法的概念,在这些方法中可以写方法的实体:
public interface Human{
public static void cry(){
System.out.println("人人都会哭泣");
}
default void walk(){
System.out.println("人人都会走路");
}
}
对于静态方法来说,这有违我们设计一个接口的初衷;而对于默认方法,则显得没有必要,毕竟就算不默认,我们也可以在子类中重写这个方法.
那么接口的意义何在呢?莫急,接口可以看作规定了某些行为,比如说对于一个Person,一个Student,一个Worker,他们都是人类,都会run和yell,如果我对每一个人都单独的写两个方法未免显得过分繁琐,而且我也无法确定自己是否真的写了这两个方法,只有在调用的时候才能够知道.
但是通过接口我们可以确定这些类一定有run和yell方法,因为他们引用了Human接口,调用接口之后必须重写所有的方法才能够通过编译.
如果接口内有方法没有实现,那么一定会报告这样的一个错误.
一个类可以implements 多个接口,多个接口中间用","隔开.
二、接口和多态
在学习继承的时候我们知道,Java中有动态绑定的机制,对于一个指向子类的父类引用来说,调用这个引用的方法等于调用子类中的方法,同样的,接口也能够实现多态.
对于一个接口来说,他不能被new成一个对象,但是它却可以作为引用指向任意一个实现了它的类,示例如下:
Human human = new Person();
human.run();
human = new Student();
human.run();
human.yell();
当然了,同继承相同,接口引用不能调用不属于接口的方法或者实例域.