java的接口

java的抽象类

文章目录

  • java的接口
      • 认识接口
      • 接口初体验
      • 面向接口编程
          • 抽象类和接口的关系和异同

java的接口

认识接口

接口在计算机中指的是系统对外提供的所有服务,在java中,接口是通过interface定义的实实在在的接口,也就是接口类型

  • 接口的定义:
[访问修饰] interface 接口名称 [extends 其他接口名称]{
     
	//声明变量
	//声明方法
}
public interface MyInterface{
     
	public void foo();
	//其他方法
}
  • JDK8之前的接口特性:

接口中的变量都应该是静态常量(public static final),必须要显式初始化
接口中所有的方法默认都是public abstract
接口中没有构造方法,不可以被实例化,但是可以被实现(常作为类型使用)
实现类必须实现接口中的所有方法
实现类可以实现多个接口,implement多个接口之间用逗号隔开

  • JDK8新增的接口特性

JDK1.8之后,接口里就可以有默认方法了
default关键字 默认方法
如果一个类实现了多个接口,多个接口都定义了多个同样的默认方法,第一种:实现类需要覆盖重写接口中的默认方法不然会进行报错,第二种:可以使用super来调用指定接口中的默认方法
如果一个类继承了一个抽象类,实现了一个接口,抽象类和接口存在相同的方法,采取类优先原则,优先继承抽象类的方法
接口的默认方法可以有多个

package Interface;

public interface MyInterface1 extends MyInterface2 {
     
    //接口不可以有构造方法,不可以被实例化
//    public MyInterface1(){
     
//
//    }
    //静态常量:接口中的变量必须是public static final,且要显式初始化
    public static final double PI = 3.14;//等同于double PI = 3.14;

    //在JDK8之前,接口中只可以有public abstract方法
    public abstract void m1();

    //等同于public abstract int m2();
    int m2();
}
package Interface;

public interface MyInterface2 {
     
    public abstract void m3();
}
package Kind;

import Interface.MyInterface1;
import Interface.MyInterface2;

//实现类必须实现接口中的全部抽象方法,除非实现类也是一个抽象类
public class Sub1 implements MyInterface1, MyInterface2 {
     
    @Override
    public void m1() {
     
        System.out.println("实现类实现了接口中m1的方法");
    }

    @Override
    public int m2() {
     
        return 0;
    }

    @Override
    public void m3() {
     
        System.out.println("实现类实现了第二个父类接口中的m3方法");
    }
}
package Test;

import Interface.MyInterface1;
import Interface.MyInterface2;
import Kind.Sub1;

public class Test01 {
     
    public static void main(String[] args) {
     
        //接口可以被当做类型使用
        System.out.println(MyInterface1.PI);
        //相当于父类引用指向子类对象
        MyInterface1 m = new Sub1();
        m.m1();
        MyInterface2 m2 = new Sub1();
        m2.m3();
    }
}

接口,在java中就是一个抽象的类型,在jdk8之前接口是抽象方法的集合
一个类通过实现接口的方式,从而来继承接口的抽象方法
一个类只可以继承一个类,但是可以实现多个接口
一个接口不能实现另一个接口,但是可以继承多个其他接口

接口初体验

package cn.zhz.Interface;

//USB接口:描述连接计算机和外部设备的串口总线标准,定义一种输入输出的技术规范
public interface USB {
     
    //USB接口并不实现具体的功能,通过抽象的方法来定义一种数据输入和输出的规范和标准
    void service();
}
package cn.zhz.Kind;

import cn.zhz.Interface.USB;

public class USBFan implements USB {
     
    public void service() {
     
        System.out.println("连接USB口,获得电流,风扇开始转动");
    }
}
package cn.zhz.Kind;

import cn.zhz.Interface.USB;

public class USBDisk implements USB {
     
    public void service() {
     
        System.out.println("连接USB接口,开始用来传输数据");
    }
}
package cn.zhz.Test;

import cn.zhz.Interface.USB;
import cn.zhz.Kind.USBDisk;
import cn.zhz.Kind.USBFan;

public class USBTest {
     
    public static void main(String[] args) {
     
        //USB风扇
        USB uFan = new USBFan();
        uFan.service();
        //USB标准的U盘
        USB uDisk = new USBDisk();
        uDisk.service();
    }
}

面向接口编程

抽象类和接口的关系和异同

在前面了解到了抽象类,在本节中知道了接口。其实,在java中抽象类和接口都是支持抽象定义的两种机制,由于抽象类和接口的存在,才赋予了java的强大的面向对象的能力,但是两者也是有很大的异同的:

  • 抽象类和接口的相同点

抽象类和接口都代表系统的抽象层
都不可以被实例化
都可以包含抽象方法–>用于描述系统提供的服务,不必提供具体的实现

  • 抽象类和接口的不同点

在抽象类中可以为部分普通方法提供默认实现,JDK8之前接口中只能包含抽象方法,JDK8之后接口可以包含默认方法
一个类只可以继承一个直接的父类,但是可以实现多个接口

  • 抽象类和接口的使用原则

代码满足is a的关系就是抽象类 满足has a的关系就是接口
接口是用来做系统和外界交互的窗口,是用来提供服务的
接口本身一旦制定,就不允许随意的修改
抽象类可以完成部分功能实现,还有部分功能可以作为系统的扩展点
抽象类便于复用,接口便于功能扩展和维护

下面给出一个具体的栗子:

package cn.zhz.Kind;

public abstract class Door {
     
	//开门
    public abstract void open();
	//关门
    public abstract void close();
}
package cn.zhz.Interface;

public interface Lock {
     
    //这里也可以加public abstract
    //上锁
    void lockUp();
	//开锁
    void openLock();
}
package cn.zhz.Interface;

public interface DoorBell {
     
	//门铃接口,如果有客人拜访进行拍照存储
    void takePicture();
}
package cn.zhz.Kind;

import cn.zhz.Interface.DoorBell;
import cn.zhz.Interface.Lock;

public class TheftproofDoor extends Door implements Lock, DoorBell {
     
    //上锁功能
    @Override
    public void lockUp() {
     
        System.out.println("插进钥匙,向左转三圈,锁上了,拔出钥匙");
    }

    //开锁功能
    @Override
    public void openLock() {
     
        System.out.println("插进钥匙,向右转三圈,锁开了,拔出钥匙");
    }
	
	//开门功能
    @Override
    public void open() {
     
        System.out.println("用力推,门开了");
    }
	
	//关门功能
    @Override
    public void close() {
     
        System.out.println("轻轻拉门,门关上了");
    }

    @Override
    public void takePicture() {
     
        System.out.println("拍照存储");
    }
}
package cn.zhz.Test;

import cn.zhz.Kind.TheftproofDoor;

public class TheftproofDoorTest {
     
    public static void main(String[] args) {
     
        TheftproofDoor door = new TheftproofDoor();
        //关门上锁
        door.close();
        door.lockUp();
        //有客人拜访
        door.takePicture();
        //开锁开门
        door.openLock();
        door.open();
    }
}

你可能感兴趣的:(java,java)