目录
1、接口的概述
现实生活中的接口,比如USB接口为例:
接口其实就是规定一些标准,要求各个生产厂商必须遵守这个标准。
好处:
按照这个标准生产出来的设备都能在这个USB接口上使用,能让这些设备通用。
Java中的接口:
是一个比抽象类还抽象的程序。
它里面定义的方法一般都是抽象方法。
在接口中定义的抽象方法其实就是接口定义的规范和标准。
要求它的实现类都必须具有这些方法,如果它的实现类有这些方法了说明这些实现类是可以被使用的, 否则实现类是不能被使用的。
在JDK新版本中,也可以定义默认方法、私有方法、静态方法、变量
只能从一个类继承,但可以声明实现了多个接口,接口是多重继承的替代品。
2、接口的定义格式
权限修饰符 interface 接口名{
定义抽象方法
定义常量
定义变量
定义静态方法
定义默认方法
定义私有方法
}
public interface Animal { // 接口
public abstract void eat(); // 抽象方法(标准格式)
abstract void sleep(); // 抽象方法
public void method(); // 抽象方法
public int id = 0; // 变量
public static final double PI = 3.14; // 常量
public static void method01(){ // 静态方法
}
default void method02(){ // 默认方法
}
}
3、在接口中定义抽象方法
格式:
public abstract 返回值类型 方法名(形参列表);
简化格式:
public abstract两个关键字可以都省略,也可以只写一个。
如果这两个关键字没有写全,在编译阶段,编译器会自动补全。
在大多数公司里面,都是只写public,不写abstract。
在阿里和少数公司里面,这两个关键字都不写。
void sleep(String where);
4、定义接口的 实现类
实现类就是一个普通的类,但是需要实现(重写)接口中所有的抽象方法。
在实现类中重写接口中的抽象方法,叫做实现接口中的抽象方法。
定义实现类 实现 接口:
权限修饰符 class 类名 implements 接口名{
实现接口中的抽象方法
定义自己特有的属性和方法
}
public interface Animal { // 接口
public abstract void eat(String food); // 抽象方法(标准格式)
public abstract void sleep(String where);
}
public class Cat implements Animal { // 实现类
public void eat(String food){
System.out.println("猫吃"+food);
}
public void sleep(String where){
System.out.println("猫睡"+where);
}
}
5、接口的使用
定义实现类的对象,然后通过对象调用实现的方法。
1.先创建实现类的实例对象:
实现类名 对象名 = new 实现类名(实参列表);
2.通过对象调用实现的方法:
对象名.方法名(实参列表);
接口练习
1、假设一个学校接待方面的程序,招待不同身份的人的食宿问题,其对应规则如下:
身份 | 食 | 宿 |
学生 | 食堂 | 宿舍 |
教师 | 教师食堂 | 学校公寓 |
学生家长 | 招待所 | 招待所 |
理论上,当然可以对每个不同身份的人各定义一个对应的类,并实现各自的方法,但是观察这些类,可以归纳出其有一个共同的模板,即“人”的“食、宿”问题。这时候,就可以发挥接口的功能了。
public interface Person {
public abstract void eat();
public abstract void sleep();
}
public class Student implements Person{
@Override
public void eat() {
System.out.println("在食堂吃饭");
}
@Override
public void sleep() {
System.out.println("在宿舍睡觉");
}
}
public class Teacher implements Person {
@Override
public void eat() {
System.out.println("在教师食堂吃饭");
}
@Override
public void sleep() {
System.out.println("在学校公寓睡觉");
}
}
public class Parent implements Person{
@Override
public void eat() {
System.out.println("在招待所吃饭");
}
@Override
public void sleep() {
System.out.println("在招待所睡觉");
}
}
2、需求说明:
电视、风扇、冰箱等各种电器要想工作必须提供电源,使用接口模拟电器获得电源后进行工作。
分析:
定义电源插座的接口(SocketInterface),具有供电的能力。getElectric()方法
定义类:电视类(TV)、风扇类(Fan)、冰箱类(Icebox),分别实现电源插座接口。
定义测试类,包含电器开始工作的方法,参数为电器对象(接口的引用指向实现类的对象,实现多态)
public interface SocketInterface { // 电源插座接口
public abstract void getElectric(); // 通电的方法
}
public class TV implements SocketInterface{
@Override
public void getElectric() {
System.out.println("电视通电后开始工作");
work();
}
public void work(){
System.out.println("电视播放节目");
}
}
public class Icebox implements SocketInterface {
@Override
public void getElectric() {
System.out.println("冰箱通电后开始工作");
work();
}
public void work(){
System.out.println("冰箱工作");
}
}
public class Fan implements SocketInterface {
@Override
public void getElectric() {
System.out.println("风扇通电后开始工作");
work();
}
public void work(){
System.out.println("风扇工作");
}
}
public class SocketInterfaceDemo {
public static void main(String[] args) {
TV tv = new TV();
work(tv);
Icebox ib = new Icebox();
work(ib);
Fan fan = new Fan();
work(fan);
}
public static void work(SocketInterface sif){
sif.getElectric();
}
}
6、接口的特点
1.接口没有构造方法,不能创建对象。
2.接口只能被它的实现类使用,一个接口可以有多个实现类。
3.接口中可以定义抽象方法,静态方法,默认方法,私有方法,不能定义实例方法。
4.接口可以继承接口,而且可以多继承:
java中的类只能单继承,不能多继承。
5.一个实现类可以实现多个接口。
在什么时候使用接口,什么时候使用抽象类?
当从类中抽取出来的除了有抽象方法外,还有属性或者普通的方法时,需要使用抽象类。
当从类中抽取出来的只有抽象方法时,需要使用接口。
7、一个实现类可以同时实现多个接口
java中允许一个实现类同时实现多个接口的目的,是为了提高实现类的扩展性。
格式:
权限修饰符 class 类名 implements 接口1, 接口2, ...{
实现所有接口中的抽象方法
定义自己特有的属性和方法
}
8、接口的继承
接口可以继承接口,而且可以多继承.
目的是为提高接口的扩展性.
格式:
权限修饰符 interface 接口名 extends 父接口名1,父接口名2,...{
定义抽象方法
...
}
面向接口的开发:
高内聚,低耦合
9、设计提示
1.能用接口的地方,不用类。(面向接口编程)
2.一个模块尽量少知道其它模块的信息,知道的越少,对今后的维护越有利。
上一篇:(30)Java基础 --抽象类