Java面向对象之 接口: [修饰符] interface 接口名 {...};子接口:[修饰符] interface 接口名 extends 父接口,父接口2...{...}
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 啊!...哦...啊... */
其他类似案例场景
接口实现业务逻辑课插拔,更换数据库直接改配置文件即可。
posted on 2021-03-30 22:17 zhangmingda 阅读(1653) 评论(0) 编辑 收藏 举报