1、什么是接口?
类比抽象类,把功能或者特性类似的一类 抽象的更彻底,可以提炼出更加特殊的“抽象类”----接口
2、如何定义接口
语法:
[修饰符] interface 接口名 {
N个常量定义...
N个抽象方法定义...
N个内部类、接口、枚举定义....
N个私有方法,默认方法或者类方法定义
}
修饰符一般为public 即可以跨包访问,绝大多数情况接口都是需要跨包访问的
3、接口特性注意:
接口修饰符public可以省略,省略后不能在包外访问,所以99%+ 实际应用中都是需要public
不支持变量定义,定义出来的变量都是常量。也就是说默认都是被隐藏的static、final修饰的类变量。
如下两行代码效果一样
int maxNum = 10;
public static final int maxNum = 10;
接口中定义的方法,认都是public (公开)、abstract (抽象) 的。必须被类实现,
java9接口中还可以定义默认方法。当实现类中没有重写方法的话,调用的就是这个默认方法。
java9接口中还可以使用private的方法。这些private 的方法就是给默认方法充当工具方法的。
示例:图形接口
package com.zmd.study.interface_example;
/**
* @ClassName Shape
* @projectName: object1
* @author: Zhangmingda
* @description: 定义一个形状接口,用于三角形或其它图形类实现功能,或者子接口继承
* date: 2021/3/30.
*/
public interface Shape {
/**
* 接口中定义的变量 默认为常量:自动被public static final 修饰
* 如下mxNum变量的定义等于:public static final int maxNum = 10;
*/
int maxNum = 10;
//public static final int maxNum = 10;
/**
* 获取平面图形的类型
*/
public abstract String getType();
/**
* 获取平面图形的周长
*/
public abstract double getPerimeter();
}
三角形类实现接口
package com.zmd.study.interface_example;
/**
* @ClassName Triangle
* @projectName: object1
* @author: Zhangmingda
* @description: 类实现了接口功能,使用implements关键字
* date: 2021/3/30.
*/
public class Triangle implements Shape {
/**
* 三角形的三边长类型定义
*/
private double a;
private double b;
private double c;
/**
* 构造方法,创建三角形实例必须提供三边长度
*/
public Triangle(double a, double b, double c) {
/**
*@params [a, b, c] 三角形三边长度
*@return null
*@创建时间 2021/3/30
*/
if(a+b < c || a+c < b || b+c < a){
System.out.println("Failed!:三角形的两边之和必须大于第三边");
return;
}
this.a = a;
this.b = b;
this.c = c;
}
@Override
public String getType() {
if(a+b < c || a+c < b || b+c < a){return "未知图形";}
return "三角形";
}
@Override
public double getPerimeter() {
return a + b + c;
}
}
测试运行
package com.zmd.study.interface_example;
/**
* @ClassName InterfaceTest
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/3/30.
*/
public class InterfaceTest {
public static void main(String[] args) {
Shape triangle = new Triangle(3,4,5);
System.out.println(triangle.getType());
System.out.println(triangle.getPerimeter());
}
}
/**
输出:
三角形
12.0
*/
4、接口的默认方法 default 修饰 (java 9新特性)
实现类中没有重写方法的话,调用的就是这个默认方法。
如上Shape.java中 增加default修饰的方法
package com.zmd.study.interface_example;
/**
* @ClassName Shape
* @projectName: object1
* @author: Zhangmingda
* @description: 定义一个形状接口,用于三角形或其它图形类实现功能,或者子接口继承
* date: 2021/3/30.
*/
public interface Shape {
...同上省略/**
* 定义一个默认方法;如果实现接口的类没有写这个方法,也可以使用
*/
default public void printMe(){
System.out.println("我是:" + getType() + "我的周长是:" + getPerimeter());
}
}
三角形类同上:Triangle.java
测试类实例化三角形Triangle()调用printMe()方法
public class InterfaceTest {
public static void main(String[] args) {
Shape triangle = new Triangle(3,4,5);
System.out.println(triangle.getType());
System.out.println(triangle.getPerimeter());
triangle.printMe();
}
}
/**
三角形
12.0
我是:三角形我的周长是:12.0
/*
5、接口中的private的方法(java9新特性)
作用:完全是给default 默认方法充当工具方法,当有多个default方法有共同的代码的时候,可以单独列出来。
package com.zmd.study.interface_example;
/**
* @ClassName Shape
* @projectName: object1
* @author: Zhangmingda
* @description: 定义一个形状接口,用于三角形或其它图形类实现功能,或者子接口继承
* date: 2021/3/30.
*/
public interface Shape {
...省略如上代码...
/**
* 定义一个默认方法;如果实现接口的类没有写这个方法,也可以使用
*/
default public void printMe(){
beforPrintMe();
System.out.println("我是:" + getType() + "我的周长是:" + getPerimeter());
}
/**
* java9 特性:接口可以用private 私有的方法,给default方法充当工具方法
*/
private void beforPrintMe(){
System.out.println("beforPrintMe()....干了一些活");
}
}
三角形类同上:Triangle.java
测试类实例化三角形Triangle()调用printMe()方法
package com.zmd.study.interface_example;
/**
* @ClassName InterfaceTest
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/3/30.
*/
public class InterfaceTest {
public static void main(String[] args) {
Shape triangle = new Triangle(3,4,5);
System.out.println(triangle.getType());
System.out.println(triangle.getPerimeter());
triangle.printMe();
}
}
/**
三角形
12.0
beforPrintMe()....干了一些活
我是:三角形我的周长是:12.0
*/
6、子接口定义(接口的继承)
语法:
[修饰符] interface 接口名 extends 父接口,父接口2...{
....同上
}
示例:
动物接口、人接口、女人接口;女人接口继承动物和人。wife 类实现女人接口。wife类就具有如上接口的default方法
动物接口
package com.zmd.study.interface_example;
public interface Animal {
default void yell(){
System.out.println("动物 啊....叫喊!!!");
}
}
人接口
package com.zmd.study.interface_example;
public interface Person {
default void makeLove(){
System.out.println("Person makeLove 啊!...哦...啊...");
}
}
女人接口
package com.zmd.study.interface_example;
public interface Woman extends Animal, Person{
}
wife类
package com.zmd.study.interface_example;
public class Wife implements Woman {
}
测试类
package com.zmd.study.interface_example;
public class InterfaceTest {
public static void main(String[] args) {
Wife wife = new Wife();
wife.yell();
wife.makeLove();
}
}
/**
动物 啊....叫喊!!!
Person makeLove 啊!...哦...啊...
*/
7、一个类实现多个接口
用一个学生类实现6中的Animal、Person接口。并增加自己的功能
学生类Student.java
package com.zmd.study.interface_example;
public class Student implements Animal,Person {
public void study(){
System.out.println("学习");
}
}
测试类
package com.zmd.study.interface_example;
/**
* @ClassName InterfaceTest
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/3/30.
*/
public class InterfaceTest {
public static void main(String[] args) {
Student student = new Student();
student.study();
student.yell();
student.makeLove();
}
}
/**
学习
动物 啊....叫喊!!!
Person makeLove 啊!...哦...啊...
*/
其他类似案例场景
接口实现业务逻辑课插拔,更换数据库直接改配置文件即可。