语法上的不同
声明:
接口:用interface声明接口
抽象类:用abstract class 声明抽象类
成员变量:.
接口 :在接口中没有变量,其成员无论怎样去定义,都是公共常量,即接口中定义的变量默认是public static final 型,(即使不显式标识,编译器也会为其自动加上)且必须给其初值,所以实现类中不能重新定义,也不能改变其值。
抽象类:抽象类的成员变量则是完全依据显式定义的不同而不同,编译器将不会做任何动作,没有任何强制限制。
方法:
接口:接口中的方法默认都是 public,abstract 类型的,接口中不能有非抽象方法。
抽象类:可以有抽象方法和非抽象方法,但只要有一个方法是抽象的,该类必须定义为抽象类,要不然编译出错。若有抽象方法,该方法不能为final 、static、 private。
继承:
接口:接口可以继承自多个来自不同继承树上的接口,但是其只能继承自接口,不能继承自类。继承后,不能设计其父接口中的方法,接口不能实现别的接口,也就是说定义接口时不能出现 implements 关键字。
抽象类:抽象类只能继承一个父类,但可以实现多个接口,其可以选择性地设计父类或父接口中的抽象方法。
多态
接口:接口类型的引用可以指向任何实现自该接口或实现该接口的子接口的类,通过接口引用可以访问其指向的对象中实现自接口的方法
抽象类:抽象类的引用可以指向其子类的对象,通过该引用可以访问子类中继承自该抽象类的所有属性和方法。
具体含义的不同
接口与抽象类在具体含义上很大的不同,抽象类更注重其是什么及其本质;而接口更注重其具有什么样的功能及其能充当什么样的角色。
例如,可以飞的事物有很多,如飞机、鸟或超人。但是飞机的实质是个机械工具,需要汽油;而鸟与超人的实质是动物,需要进食。所以,鸟可以继承自动物,但其可以扮演飞行器这个角色,下面示例说明了这个问题。
//接口与抽象类差异示例
package chapter05.sample5_2;
//创建飞行器接口Flyer
interface Flyer{
//飞行器都可以飞行,fly为飞行方法。所以继承Flyer接口的类都必须实现该方法
public void fly();
}
//创建机器抽象类,其中机器类有一个消耗(consume)方法,该方法为抽象方法
abstract class Vehicle{
public abstract void consume();
}
//创建动物抽象类,动物类中有一个进食(eat)方法,该方法也为抽象方法
abstract class Animal{
public abstract void eat();
}
//创建飞机抽象类,该类继承自机器类,实现了飞行器的接口
//并且实现了从抽象父类和接口过来的抽象方法
class AirPlane extends Vehicle implements Flyer{
//实现抽象方法
public void consume(){
System.out.println("消耗汽油的飞行器!!!");
}
public void fly(){
System.out.println("我是飞机!!!");
}
}
//创建鸟类,鸟类继承自动物类,实现了飞行器接口
class Brid extends Animal implements Flyer{
//实现继承的抽象方法
public void eat(){
System.out.println("鸟需要吃东西!!");
}
public void fly(){
System.out.println("我是一只鸟!!!");
}
}
//主类,在主方法中创建了飞机对象与鸟对象,并且演示了鸟与飞机的异同
public class Sample5_2{
public static void main(String[] args){
//创建鸟类对象
Brid b = new Brid();
//创建飞机对象
AirPlane air = new AirPlane();
//飞机执行的动作
System.out.println("******飞机执行的动作******");
air.fly();
air.consume();
//鸟执行的动作
System.out.println("******鸟执行的动作******");
b.fly();
b.eat();
}
}
由上可以看出,飞机与鸟有不同之处,即都会飞,也就是都实现了飞行器这个接口。但飞机与鸟之间有本质的区别,即其没有任何继承关系,一个是机械,一个是动物。
由此可见,接口的实现与抽象类的继承的含义是不同的,应该站在不同的角度看待这两个概念,一个是物质的本质,而另一个则是物体可以充当的角色。
大家觉得本文边幅太长,还可以去这里看看http://blog.csdn.net/fenglibing/article/details/2745123
详细解析Java中抽象类和接口的区别_天极网
http://dev.yesky.com/436/7581936.shtml