接口它是一种规范(规则),是用来约束双方的。将接口规则定义好之后,双方就可以在接口的规则下进行具体的代码实现,然后双方之间就可以进行通信。
例如:天气数据
各大网站可能都需要显示天气数据,而数据在中央气象局。中央气象局会提供获取天气的数据接口,然后各大网站可以根据这个接口规范传递数据,最终拿到某个地区的天气信息。
修饰符 interface 接口名{
// 定义变量
// 定义方法
}
接口的名称和类名的书写规范一致:多个单词每个单词首字母大写。
接口中的变量:它有固定的修饰符(public static final)
接口中的方法:JDk8之前,接口中只能定义抽象方法(public abstract)
// 定义接口
interface Inter{
// 如果一个变量被final修饰,变量名一般要求全部大写
// 转大写:ctrl + shift + x
// 转小写:ctrl + shift + y
public static final int NUMBER = 12;
int AGE = 33;
public abstract void demo();
void func();
}
因为接口中的变量和抽象方法都有默认的修饰,可以在书写的时候省略。
但是建议:在书写方法的时候,将public写着。
一般接口中的方法都是抽象方法(JDK8之前),要求必须有类去实现接口中的方法,然后创建这个类的对象,进而去使用相关的方法。
类和类之间是:继承关系,并且是单继承
class A{
}
class B extends A{
}
class C extends B{
}
接口和类之间:是实现关系,使用implements关键字,并且一个类可以同时实现多个接口
interface Inter1{
}
interface Inter2{
}
interface Inter3{
}
class Demo implements Inter1,Inter2,Inter3{
// 如果接口中有抽象方法,需要在这个类中全部复写(实现)
// 如果类没有将接口中的抽象方法全部复写,那么这个类依然是一个抽象类
}
接口和接口之间:是继承关系,并且是多继承
interface Inter1{
}
interface Inter2{
}
interface Inter3{
}
interface Inter4 extends Inter1, Inter2 , Inter3{
}
多个接口中即使有同名的抽象方法,最终也会被子接口继承到,但是依然是抽象方法,最终还是需要实现类将抽象方法给复写,最终依然是创建实现类的对象,调用类中复写的方法完成相关功能。
interface Inter1{
public void demo();
public void method();
}
interface Inter2{
public void demo();
public void func();
}
// 多个父接口中有同名的方法,子接口统一继承到
interface Inter3 extends Inter1 , Inter2{
}
// 在实现类中只需要复写一次
class Demo implements Inter3{
public void demo() {
}
public void method() {
}
public void func() {
}
}
public class InterfaceDemo {
public static void main(String[] args) {
Demo d = new Demo();
d.demo();
}
}
如果多个接口中存在同名的变量,在通过实现类或者子接口调用的时候也会发生不确定性,这时需要通过对应的接口名去调用变量。
interface Inter1{
int X = 12;
}
interface Inter2{
int X = 34;
}
interface Inter3 extends Inter1, Inter2{
}
class Demo implements Inter3{
}
class Test{
public static void main(String[] args) {
Demo d = new Demo();
// d.x 发生不确定性
// Inter1.X 或者 Inter2.X 去使用接口中的变量
}
}
建议定义接口的时候,尽量不要重名的变量。
父类和子类:它们永远属于同一个体系。父类中描述的行为(方法)一定是这个体系中共同拥有的。
接口:一般描述的行为属于整个体系之外的一些额外(特殊的行为)
/*
* 描述动物:猫、狗、猪,它们有共同的父类Animal
* 某个动物经过后天的训练具备不属于这个物种本身固有的一些行为,这些行为一般都会采用接口描述
*/
abstract class Animal{
// 描述的是所有动物共性的eat行为
public abstract void eat();
}
// 缉毒的接口
interface AntiDrug{
public void antiDrug();
}
// Dog经过后天训练具备缉毒的行为
class Dog extends Animal implements AntiDrug{
public void eat() {
System.out.println("啃骨头");
}
// 复写缉毒的行为
public void antiDrug() {
System.out.println("狗缉毒");
}
}
class Cat extends Animal{
public void eat() {
System.out.println("吃鱼");
}
}
//Pig经过后天训练具备缉毒的行为
class Pig extends Animal implements AntiDrug{
public void eat() {
System.out.println("吃糠");
}
// 复写缉毒的行为
public void antiDrug() {
System.out.println("猪缉毒");
}
}
public class InterfaceDemo2 {
public static void main(String[] args) {
Dog d = new Dog();
d.eat();
Pig p = new Pig();
p.antiDrug();
}
}
/*
* JDK8中允许在接口中定义非抽象方法
* 默认方法:方法需要使用default关键字修饰
*/
interface Inter{
int X = 12;
public void demo();
// JDK8 接口中允许书写默认方法
default void func() {
System.out.println("接口中的default方法");
method();
}
// JDK11接口中允许书写静态的方法
static void run() {
System.out.println("接口中的static方法");
// 静态无法访问非静态
//method();
}
// JDK11接口中允许定义私有的方法
private void method() {
System.out.println("接口中的私有方法");
}
}
// 接口的实现类后缀Impl
class InterImpl implements Inter{
public void demo() {
}
}
public class InterfaceDemo3 {
public static void main(String[] args) {
Inter.run();
InterImpl ii = new InterImpl();
ii.func();
ii.demo();
}
}