1 接口的概念
笔记本上的USB口,电源插座等都是接口
接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用
在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型
2 语法规则
接口的定义格式与定义类的格式基本相同,将class关键字换成 interface 关键字,就定义了一个接口
public interface 接口名称{
// 抽象方法
public abstract void method1(); // public abstract 是固定搭配,可以不写
public void method2();
abstract void method3();
void method4();
// 注意:在接口中上述写法都是抽象方法,跟推荐方式4,代码更简洁
}
3 接口使用
接口不能直接使用,必须要有一个"实现类"来"实现"该接口,实现接口中的所有抽象方法。
public class 类名称 implements 接口名称{
// ...
}
注意:子类和父类之间是extends 继承关系,类与接口之间是 implements 实现关系。
我们先来定义一个接口:
public interface IUSB {void openDevice();void closeDevice();
}
再来定义第一个Mouse类:
public class Mouse implements IUSB {@Overridepublic void openDevice() {System.out.println("打开鼠标");}@Overridepublic void closeDevice() {System.out.println("关闭鼠标");}public void click(){System.out.println("点击鼠标!");}
}
第二个KeyBoard类:
public class KeyBoard implements IUSB{@Overridepublic void openDevice() {System.out.println("打开键盘!");}@Overridepublic void closeDevice() {System.out.println("关闭键盘!");}public void input(){System.out.println("键盘输入");}
}
第三个Computer类来实现最后结果:
package demo;public class Computer {public void powerOff() {System.out.println("关闭电脑");}public void powerOn() {System.out.println("打开电脑");}public void useDevice(IUSB usb){usb.openDevice();if(usb instanceof Mouse){Mouse mouse = (Mouse) usb;mouse.click();}if(usb instanceof KeyBoard){KeyBoard keyBoard = (KeyBoard) usb;keyBoard.input();}usb.closeDevice();}public static void main(String[] args) {Computer computer=new Computer();computer.powerOn();computer.useDevice(new KeyBoard());computer.useDevice(new Mouse());computer.powerOff();}}
结果:
4, 接口特性
1. 接口类型是一种引用类型,但是不能直接new接口的对象
public class TestUSB {
public static void main(String[] args) {
USB usb = new USB();
}
}
// Error:(10, 19) USB是抽象的; 无法实例化
2. 接口中每一个方法都是public的抽象方法, 即接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错
public interface USB {
// Error:(4, 18) java: 此处不允许使用修饰符private
private void openDevice();
void closeDevice();
}
3. 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现
public interface USB {
void openDevice();
// 编译失败:因为接口中的方式默认为抽象方法
// Error:(5, 23) 接口抽象方法不能带有主体
void closeDevice(){
System.out.println("关闭USB设备");
}
}
4. 重写接口中方法时,不能使用默认的访问权限
public interface USB {
void openDevice(); // 默认是public的
void closeDevice(); // 默认是public的
}
public class Mouse implements USB {
@Override
void openDevice() {
System.out.println("打开鼠标");
}
// ...
}
// 编译报错,重写USB中openDevice方法时,不能使用默认修饰符
// 应该在void前加上public
5. 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量
6. 接口中不能有静态代码块和构造方法
7. 接口虽然不是类,但是接口编译完成后字节码文件的后缀格式也是.class
8. 如果类没有实现接口中的所有的抽象方法,则类必须设置为抽象类
9. jdk8中:接口中还可以包含default方法。
interface A {void test1();static void test2() {System.out.println("static()"); }default void test3() {System.out.println("default()"); }
}
class TestDemo implements A {@Overridepublic void test1() {//必须重写System.out.println("重写方法test1()!"); }@Overridepublic void test3() {//不重写也可以System.out.println("重写test3()"); }
}
public class Test {public static void main(String[] args) {TestDemo testDemo = new TestDemo();testDemo.test1();testDemo.test3();A.test2(); }
}
5,实现多个接口
在Java中,类和类之间是单继承的,一个类只能有一个父类,即Java中不支持多继承,但是一个类可以实现多个接 口。
interface IA {void testA();
}
interface IB {void testB();
}
class TestDemo2 implements IA,IB {@Overridepublic void testA() {System.out.println("testA()");}@Overridepublic void testB() {System.out.println("testB()");}
}
public class Test1 extends TestDemo2{public static void main(String[] args) {TestDemo2 testDemo2 = new TestDemo2();testDemo2.testA();testDemo2.testB();}
}
注意:一个类实现多个接口时,每个接口中的抽象方法都要实现,否则类必须设置为抽象类。
提示, IDEA 中使用 ctrl + i 快速实现接口
package demomoreiner;public abstract class Animal {protected String name;protected int age;public Animal(String name, int age) {this.name = name;this.age = age;}//继承是对共性的抽取 那么意味着 这里面的成员变量 成员方法 都是共性 共有的public abstract void eat();
}
package demomoreiner;public interface ISwimming {void swim();
}
package demomoreiner;public interface IRunning {void run();
}
package demomoreiner;public interface IFly {void fly();
}
package demomoreiner;public class Fish extends Animal implements ISwimming{public Fish(String name,int age) {super(name,age);}@Overridepublic void swim() {System.out.println(this.name +"游泳!");}@Overridepublic void eat() {System.out.println(this.name + "吃鱼粮!");}
}
package demomoreiner;public class Duck extends Animal implements ISwimming,IFly,IRunning {public Duck(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println(this.name + "吃鸭粮");}@Overridepublic void fly() {System.out.println(this.name + "正在飞....");}@Overridepublic void run() {System.out.println(this.name + "正在跑....");}@Overridepublic void swim() {System.out.println(this.name + "正在游泳....");}
}
package demomoreiner;public class Test {public static void eatFunc(Animal animal) {animal.eat();}public static void walk(IRunning running) {running.run();}public static void main(String[] args) {walk(new Duck("唐老鸭",10));eatFunc(new Duck("唐老鸭",10));}public static void main1(String[] args) {eatFunc(new Duck("唐老鸭",10));eatFunc(new Fish("小鱼儿",3));}
}
上面的代码展示了 Java 面向对象编程中最常见的用法: 一个类继承一个父类, 同时实现多种接口.
6 接口间的继承
在Java中,类和类之间是单继承的,一个类可以实现多个接口,接口与接口之间可以多继承。即:用接口可以达到 多继承的目的。
接口可以继承一个接口, 达到复用的效果. 使用 extends 关键字.
interface IA {void testA();
}
interface IB {void testB();
}
interface IC extends IA,IB{void testC();
}
class TestDemo implements IC {@Overridepublic void testA() {System.out.println("testA()");}@Overridepublic void testB() {System.out.println("testB()");}@Overridepublic void testC() {System.out.println("testC()");}
}public class Test {public static void main(String[] args) {}
}