相同点:
- 都有抽象方法
- 接口同类一样,在使用上也满足多态性
- 接口的实现与抽象类的继承相似
接口通过让类去实现(implements)的方式来使用。
如果实现类覆盖了接口中的所有方法,则此实现类就可以实例化;如果实现类没有覆盖接口中所有的抽象方法,则此实现类仍为一个抽象类,需要用abstract修饰。
若子类重写了父类中所有的抽象方法,此子类可以实例化,如果子类没有重写父类中所有的抽象方法,则此子类仍为抽象类,需要用abstract修饰。
public class InterfaceTest {
public static void main(String[] args) {
//接口的静态变量的调用和类相同,使用接口.静态变量直接调用
System.out.println(flyable.MAX_SPEED);
PaperKite paperKite = new PaperKite();
paperKite.stop();
paperKite.fly();
//接口的实现类同样继承了接口的属性
int maxSpeed = paperKite.MAX_SPEED;
System.out.println(maxSpeed);
}
}
interface flyable{
public static final int MAX_SPEED=7900;
int MIN_SPEED=1;
public abstract void fly();
void stop();
}
//实现类没有实现接口的所有抽象方法,则仍为抽象类
//此抽象类的抽象方法 public abstract void stop()没有显示
abstract class Kite implements flyable{
public void fly(){
System.out.println("小风筝,我们走");
}
}
class PaperKite extends Kite{
public void stop(){
System.out.println("飞到尽头自然停");
}
}
注意 :接口的实现类同样继承了接口的属性;如果接口与父类有子类没有的同样属性,则调用的方式如下:
interface A {
int x=1;
}
class B{
int x=2;
}
class C extends B implements A{
public void show(){
System.out.println(A.X);//返回1
System.out.println(super.x);//返回2
}
public static void main(String args[]){
new C().show();
}
}
不同点:
- 接口中不能定义构造器,抽象类中一定有构造器(可以是隐式的空参构造器)
- 接口与接口之间可以多继承,抽象类作为类不可以多继承
interface AA{
void method1();
}
interface BB{
void method2();
}
interface CC extends AA,BB{
}
- 一个类可以实现多个接口
class Bullet extends Object implements Flayable,Attackable{
//重写的方法
}