接口
java中的一个重要组成部分接口,其主要作用是外部引入一些功能。由于java是一个单继承的语言,而类中的行为都是与生俱来的行为。而在实际生活并不是如此单一,我们可以通过后来的学习,掌握更多的技能,不仅仅是父亲所拥有的。比如:一个人会唱歌会跳舞,唱歌跳舞并不是与生俱来的行为,这时候我们可以把唱歌、跳舞定义为接口。
接口的特点:
1.接口文件最后同样也会被编译成 服务器接口.class的字节码文件
2.接口与抽象类一样,不能被实例化.所有的抽象方法必须由接口的实现类来实现。类不能继承接口,只能实现接口。
3.接口所有方法只能定义为抽象方法,不能拥有方法体
4.接口中的所有方法,访问修饰符默认是Public,不写也是public接口方法中,可以不写Public以及abstract修饰符。系统会默认添加public及abstract.
5.接口不能拥有构造器、初始化块 6、接口不能定义“成员变量”,只能定义公开的静态的常量。在定义常量时,可以写成public static final.也可以写成:static final 也可写成final 甚至也可以省略final static
7、接口中可以定义无限个常量,可以定义无限的抽象方法(理论上)
类只能单继承,但可以多实现,接口之间“逗号”间隔
接口的语法:
定义接口:
/**
* 接口
* @author Administrator
*
*/
public interface interfaceName{
/**
* 方法
*/
void methodName();
}
使用接口:
public class 类名 implements 接口名 {
}
使用接口的原则
-
使用接口解决多继承
-
使用接口为外部类调价功能
以面向对象的角度考虑,将一个类与自身的特征和行为依赖于外部的可选特征和想和行为分离,让类尽可能的丰富,让我们在设计程序时,不再关注具体的类,而是分离关注类上拥有哪些接口所定义的能力,从而做到程序设计时,类类的直接关系,变换为类-接口-类,这种变换关系,称之为“解耦”。
接口的优点
设计和实现分离,对外隐藏了实现。
面向接口编程是OOP的核心。
接口与抽象类的区别
语法上:
定义 | 接口 | 抽象类 |
---|---|---|
interface | abstract | |
抽象方法 | 都可以 | |
使用 | implements | extends |
多实现,多继承 | 单继承 |
JDK1.8之后,出现新的特征:
- 在接口中可以使用Default关键字,声明非抽象方法。但是真正的访问修饰符,依旧还是public,default是一个声明关键字,并非访问修饰符。
- 接口中,可以使用static声明静态方法,但是必须要有方法体的实现。
例:一个全能运动员会射击、跳水
运动员类:
/**
* 运动员
* @author Administrator
*
*/
public abstract class Athlete {
/**
* 姓名
*/
private String name;
/**
* 性别
*/
private boolean gender;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isGender() {
return gender;
}
public void setGender(boolean gender) {
this.gender = gender;
}
}
全能运动员类:
/**
* 全能运动员
* @author Administrator
*
*/
public class AlmightyAthlete extends Athlete implements Shootingable ,Divingable {
@Override
public void diving() {
// TODO Auto-generated method stub
}
@Override
public void shooting() {
// TODO Auto-generated method stub
}
@Override
public void sprint() {
// TODO Auto-generated method stub
}
}
跳水接口:
/**
* 跳水
* @author Administrator
*
*/
public interface Divingable {
void diving();
}
射击
/**
* 射击
* @author Administrator
*
*/
public interface Shootingable {
/**
* 射击
*/
void shooting();
}