一.什么是接口?
不同的类有相同的功能,而抽象类很难实现
例如下面是一个抽象图形类,继承它的子类都需要重新抽象方法。
但如果三角形类不需要draw()方法,只能去掉图形类中的draw()或把draw()变成图形类私有
去掉图形类中的draw()方法,它所有的子类都没有这个方法,虽然三角形类不需要,但别的类需要
如果把draw变成私有,不利于架构
所以,我们要用到接口
1.接口实现用implements关键字,继承用extends
2.implements接口必须重写方法
3.接口只需要写方法体
二.多重继承
举例:步兵射击,医疗兵既可以射击又可以治疗
代码语言:javascript复制public interface Attack {
public void shot();
}
代码语言:javascript复制public interface Trentment {
public void trent();
}
代码语言:javascript复制public class Infantry implements Attack{
@Override
public void shot() {
// TODO Auto-generated method stub
System.out.println("步兵射击");
}
}
代码语言:javascript复制public class Medic implements Attack,Trentment{
@Override
public void trent() {
// TODO Auto-generated method stub
System.out.println("医疗兵治疗");
}
@Override
public void shot() {
// TODO Auto-generated method stub
System.out.println("医疗兵射击");
}
}
代码语言:javascript复制public class Text {
public static void main(String[] args) {
Infantry infantry = new Infantry();
infantry.shot();
Medic medic = new Medic();
medic.shot();
medic.trent();
}
}
输出:
步兵射击 医疗兵射击 医疗兵治疗
由于shot是共有的,我们让Trentment继承Attack
医疗兵只需要实现Trenment一个接口就行
代码语言:javascript复制public interface Trentment extends Attack{
public void trent();
}
代码语言:javascript复制public class Medic implements Trentment{
@Override
public void trent() {
// TODO Auto-generated method stub
System.out.println("医疗兵治疗");
}
@Override
public void shot() {
// TODO Auto-generated method stub
System.out.println("医疗兵射击");
}
}
总结:接口可以继承父接口,而类可以实现多个接口
三.接口和抽象类的区别
1.子类只能继承一个抽象类,但可以实现任意多的接口
代码语言:javascript复制public class Medic extends HH implements Trentment,Attack{
//继承一个抽象类,可以有多个接口
}
2.接口中的方法都是抽象方法,而抽象类中可以有非抽象方法
接口中关键字默认abstract
代码语言:javascript复制public abstract class HH {
public abstract void People();//继承抽象方法需要重写
public void Hey(){
System.out.println("HI~");//非抽象方法不需要重写
}
}
3.抽象类中的成员变量是各种类型的,但是接口中为静态常量
代码语言:javascript复制public interface Attack {
int id = 123;
public void shot();
}
代码语言:javascript复制public class Text {
public static void main(String[] args) {
Infantry infantry = new Infantry();
infantry.id = 456;
System.out.println(infantry.id);
}
}
第五行报错
因为接口中数据默认final static 类型
4.抽象类中可以有静态方法和静态代码块,接口不行
代码语言:javascript复制public abstract class HH {
static {
System.out.println("抽象类的静态代码块");
}
}
代码语言:javascript复制public class Text extends HH{
public static void main(String[] args) {
}
}
输出:
抽象类的静态代码块
5.接口没有构造方法,抽象类有构造方法
代码语言:javascript复制public abstract class HH {
public HH(){
System.out.println("父类构造方法");
}
}
代码语言:javascript复制public class Text extends HH{
public static void main(String[] args) {
Text text = new Text();
}
}
子类会首先调用父类构造方法
输出:父类构造方法