一.什么是接口?
不同的类有相同的功能,而抽象类很难实现
例如下面是一个抽象图形类,继承它的子类都需要重新抽象方法。
但如果三角形类不需要draw()方法,只能去掉图形类中的draw()或把draw()变成图形类私有
去掉图形类中的draw()方法,它所有的子类都没有这个方法,虽然三角形类不需要,但别的类需要
如果把draw变成私有,不利于架构
所以,我们要用到接口
1.接口实现用implements关键字,继承用extends
2.implements接口必须重写方法
3.接口只需要写方法体
二.多重继承
举例:步兵射击,医疗兵既可以射击又可以治疗
public interface Attack { public void shot(); }
public interface Trentment { public void trent(); }
public class Infantry implements Attack{ @Override public void shot() { // TODO Auto-generated method stub System.out.println("步兵射击"); } }
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("医疗兵射击"); } }
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一个接口就行
public interface Trentment extends Attack{ public void trent(); }
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.子类只能继承一个抽象类,但可以实现任意多的接口
public class Medic extends HH implements Trentment,Attack{ //继承一个抽象类,可以有多个接口 }
2.接口中的方法都是抽象方法,而抽象类中可以有非抽象方法
接口中关键字默认abstract
public abstract class HH { public abstract void People();//继承抽象方法需要重写 public void Hey(){ System.out.println("HI~");//非抽象方法不需要重写 } }
3.抽象类中的成员变量是各种类型的,但是接口中为静态常量
public interface Attack { int id = 123; public void shot(); }
public class Text { public static void main(String[] args) { Infantry infantry = new Infantry(); infantry.id = 456; System.out.println(infantry.id); } }
第五行报错
因为接口中数据默认final static 类型
4.抽象类中可以有静态方法和静态代码块,接口不行
public abstract class HH { static { System.out.println("抽象类的静态代码块"); } }
public class Text extends HH{ public static void main(String[] args) { } }
输出:
抽象类的静态代码块
5.接口没有构造方法,抽象类有构造方法
public abstract class HH { public HH(){ System.out.println("父类构造方法"); } }
public class Text extends HH{ public static void main(String[] args) { Text text = new Text(); } }
子类会首先调用父类构造方法
输出:父类构造方法
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
我来说两句