接口是一个特殊的类,主要由全局变量和公共的抽象方法组成,接口可以说是百分之百的抽象类,也就是说,接口中的方法全都是抽象方法(Java8以前),接口通常用来定义一组通用的组件,或者功能模块。
一,接口的基本使用
不同于普通的类,类的关键字是class,接口的是interface
public interface 接口名{
}
和定义类的区别在于,将class关键字换成了interface
1 接口中的成员属性和方法
接口中也有成员属性和方法
所有的成员属性都是 public static final (公共的静态常量)类型
所有的方法都是:public abstract (公共的抽象方法)
public interface Test1 {
int a = 0;
void hello();
}
可以省略不写前面的修饰词,接口会默认。
我们去可以测试一下
public class Test {
public static void main(String[] args) {
Test1 test1 = new Test1() {
@Override
public void hello() {
System.out.println("hello");
}
};
test1.hello();
System.out.println(Test1.a);
}
}
输出结果:
可以看到a可以直接被类名引用出来,表示为公开的静态变量
如果我们尝试修改a的值
此时会报错,说明a是被final修饰的值,无法被修改。
2 接口的基本使用
我们需要使用implements关键词去实现接口。
public class getTest1 implements Test1 {
@Override
public void hello() {
System.out.println("我是getTest1中的hello方法");
}
}
由于接口中的方法是抽象方法,所以在接口实现类中,必须实现接口中规定的方法。
测试结果如下:
一个类可以实现多个接口,但必须实现所有接口中的方法
二,函数式接口
就是接口中只有一个抽象方法的接口,称为函数式接口,需要在接口的上方加上@FunctionalInterface 注解
只要接口只定义了一个抽象方法,那它就是一个函数式接口,还有在上述Java Api中都有个@FunctionalInterface注解,这表示着该接口会设计成一个函数式接口,不符合规范的话,就会编译报错。
三,接口间的相互继承
让Test2接口继承Test1接口
public interface Test2 extends Test1{
void hello2();
}
在接口实现类中只实现Test2接口
public class GetTest1 implements Test2 {
//Test1接口中的方法
@Override
public void hello() {
System.out.println("我是Test1中的hello方法");
}
//Test2接口中的方法
@Override
public void hello2() {
System.out.println("我是Test2中的hello2方法");
}
}
实例(上述的具体实现,可以不用看)
原始的手机,可以发短信,通电话。随着发展,手机增加了音频、视频播放、拍照、上网功能。按照作业3的思路和下面的类图进行程序设计:首先,编写类及接口,参照以下类的结构图;其次,编写测试类,让普通手机播放音频、发信息和通电话,让智能手机上网、播放视频、照相、发彩信和视频通电话。
TheakePictures接口:
public interface TheakePictures {
public void takePictare();
}
PlayWirIng接口:
public interface PlayWirIng {
public void play(String incontent);
}
NetWork接口:
public interface NetWork {
public void networkConn();
}
Handset抽象类:
public abstract class Handset {
private String brand;
private String type;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public void sendInfo(){
System.out.println("这是一款型号为"+getBrand()+"的"+getType()+"手机:");
}
public abstract void call();
public abstract void info();
}
AptitudeHand实现类:
public class AptitudeHandst extends Handset implements TheakePictures, NetWork,PlayWirIng {
@Override
public void call() {
System.out.println("开始视频通话......");
}
@Override
public void info() {
System.out.println("发送带图片与文字的消息");
}
@Override
public void networkConn() {
System.out.println("已开启移动网络");
}
@Override
public void takePictare() {
System.out.println("咔嚓......拍照成功");
}
@Override
public void play(String incontent) {
System.out.println("开始播放视频《"+incontent+"》");
}
}
CommonHandset实现类:
public class CommonHandset extends Handset implements PlayWirIng {
@Override
public void call() {
System.out.println("发送语音通话.........");
}
@Override
public void info() {
System.out.println("发送文字消息..........");
}
@Override
public void play(String incontent) {
System.out.println("开发播放音乐《"+incontent+"》.....");
}
}
测试类:
public class TestIphon {
public static void main(String[] args) {
Handset handset = new CommonHandset();
CommonHandset comm = (CommonHandset)handset;
comm.setBrand("G502c");
comm.setType("索尼爱立信");
comm.sendInfo();
comm.play("热血");
comm.info();
comm.call();
handset = new AptitudeHandst();
AptitudeHandst apt = (AptitudeHandst)handset;
apt.setBrand("HTC");
apt.setType("I9100");
apt.sendInfo();
apt.networkConn();
apt.play("小时代");
apt.takePictare();
apt.info();
apt.call();
}
}
输出结果: