目录
一、接口基本概念
-
约定好规范,然后按照规范来做。接口就是定义规范。
-
Java 中的接口作用和生活中类似,它提供一种约定,使实现接口的类在形
式上保持一致。
-
抽象类中可以有普通方法,而接口中的方法默认都是抽象的,也可以说接
口是一个 ”特殊的 抽象类 “,接口不能被实例化,而且没有构造方法。
1.接口的格式
[修饰符] interface 接口名{ //接口成员 }
public interface USBInterface { public static final String NAME = "";//静态常量 public [abstract] void service();//抽象方法不能有方法体 }
(1) 接口中的方法默认是抽象方法,所以可以省略 public abstract 修饰符
(2) 接口中的变量只能是静态常量( static final ) , 所以可以省略 public static final ,静态常量在定义时就要赋值,且不可变。
2.接口的使用
接口使用和抽象类一样,都是通过子类。
子类通过 implements 关键字实现接口,实现接口就必须实现(重写)接口中的抽象方法
public class USBDisk implements USBInterface{ @Override public [acstract] void service() { System.out.println("service()"); } }
(1)一个类可以实现多个接口,接口之间使用 , 隔开
(2)接口的实现类中,可以有普通方法,方法必须是public
3.多个接口实现
java 中继承是单继承,使用 extends 关键字;
但是一个接口实现类可以实现多个接口,使用 implements ,多个接口之间用 , 隔开。
public class Computer implements USBInterface, ChargeInterface{
//定义一个实现类实现多个接口
public void play() { // 普通方法
System.out.println("play game");
}
@Override
public void charge() { //重写抽象方法
System.out.println("充电");
}
@Override
public void service() { //重写抽象方法
System.out.println("USB接口");
}
}
一个类可以同时继承和实现接口, extends 要在 implements 之前
public class LenovoComputer extends Computer implements USBInterface, ChargeInterface{
}
接口与接口之间是继承关系,使用 extends 关键字。多个接口使用 , 隔开
public interface USBC extends USBInterface,ChargeInterface{
}
4.接口的基础语法:
类和类之间叫做继承,用extends,类和接口之间叫做实现implement;
4.JDK8 接口新特性 default 和 static
default:在 jdk8.0 中 default 关键字可用于在接口中修饰方法(默认方法), default 修饰的方法可以有具体实现,也只能在接口中出现。 default 修饰的方法可以被重写。
默认方法可以在不破坏已经在使用该接口的所有代码。默认方法有时也称为防御方法(defender method)或 虚拟扩展方法(virtual extension method)
static:接口中还可以有 static 修饰的方法,称为静态方法(类方法)。 static 方法必须直接使用 接口名.方法名调用。
/*
* 从Java 8 开始,接口允许定义默认方法(注意是在接口)
* 格式:
* public default 返回值 方法名(){
* 方法体
* }
* 从Java 8 开始,接口允许定义静态方法。
* public static 返回值 方法名(){
* 方法体
* }
* 接口名称。静态方法名(参数列表);
*/
public interface Usb {//接口
//接口中的抽象方法
public abstract void a();
//新添加的默认方法
public default void b(){
System.out.println("实现接口升级");
}
//新添加的静态方法
public static void c(){
System.out.println("实现静态方法");
}
}
public class Usbfeng implements Usb{//实现类1
@Override
public void a() {
System.out.println("Usbfeng");
}
@Override
public void b(){
System.out.println("默认default覆盖写法");//重写默认b()方法完全可以,最后实例化对象调用
}
}
public class Usbshan implements Usb{//实现类二
@Override
public void a() {
System.out.println("Usbshan");
}
}
/*
* 1.接口的默认方法,可以通过接口实现类对象,直接调用
* 2.接口的默认方法,也可以被接口实现类进行覆盖重写
* */
public class Test {//测试类
public static void main(String[] args) {
//创建了实现类对象
Usbfeng usbfeng = new Usbfeng();
usbfeng.a();//调用抽象方法,实现的是右侧实现类
usbfeng.b();//调用默认方法,如果实现类中没有,会向上找接口
Usbshan usbshan = new Usbshan();
usbshan.a();
usbshan.b();//调用mo
Usb.c();
}
}
5.JDK9 接口新特性 private
我们需要抽取一个共有方法,用来解决多个默认方法之间重复代码的问题,但是这个共有方法不应该让实现类使用,所以私有化
解决方案:
从Java 9开始接口当中允许定义私有方法。
1.普通私有方法,解决多个默认方法之间重复代码的问题。
private 返回值类型 方法名称(参数列表){
方法体
}
public interface Typc {//代码重复率高
public default void a(){
System.out.println("默认方法A");
System.out.println("AAA");
System.out.println("BBB");
System.out.println("CCC");
}
public default void b(){
System.out.println("默认方法B");
System.out.println("AAA");
System.out.println("BBB");
System.out.println("CCC");
}
}
运用私有化后
public interface Typc {
//因为被私有化,只有a和b能够使用c,其余的地方无法使用
public default void a(){
System.out.println("默认方法A");
c();
}
public default void b(){
System.out.println("默认方法B");
c();
}
private void c(){
System.out.println("AAA");
System.out.println("BBB");
System.out.println("CCC");
}
}
测试
public class Testtypec {
public static void main(String[] args) {
Typcc typcc = new Typcc();
typcc.b();
typcc.a();
}
}
输出结果
2.静态私有方法,解决多个静态方法之间重复代码问题
private static 返回值类型 方法名称 (参数列表){
方法体
}
1.静态私有方法同理,只有本接口多个静态方法可以使用,其余作用域无法使用。 2。在Java9以后出现并使用
JDK9 接口中可以使用 private 修饰方法。供接口中其他方法调用。
二、抽象类和接口的区别(重点)
特性 | 接口 | 抽象类 |
---|---|---|
组合 | 可以在新类中组合多个接口 | 只能继承一个抽象类 |
状态 | 只含有静态字段、抽象方法、默认方法、静态方法 | 可以包含字段 |
默认方法和抽象方法 | 默认方法不需要在子类里实现,它只能引用接口中的方法 | 抽象方法必须在子类里实现 |
构造器 | 不能有构造器(接口没有构造、不能实例化) | 有构造、同样不能实例化 |
访问权限 | 隐式 public | 可以为 protected 或包访问权限 |