抽象类和接口的区别
一、 抽象类定义
在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
定义一个抽象类
abstract class vehicle{
public abstract void WheelNum();
}
二、 接口定义
所谓接口,就是指的由常量和抽象方法所组成的特殊的类。接口内的成员变量都被定义为常量,成员方法是没有方法体的抽象方法。
我们定义一个接口(体现交通工具的轮子数量)
interfacevehicle{
public void WheelNum();
}
三、 抽象类和接口的对比
相同点:
1. 抽象类和接口都和类有继承关系,都只能通过继承来实现具体的功能。
2. 抽象类和接口都可以有自己的数据成员,抽象方法。
3. 抽象类中的抽象方法和接口里的抽象方法都必须被重写实现。
不同点:
1. 多继承和单继承的关系是最本质的区别
接口是多继承的关系,接口与接口之间是多继承的,类与接口之间是多实现的关系,而抽象类是一个类,由类对他进行单继承,不能多继承,接口不能继承抽象类,但是抽象类可以实现多接口;接口不能继承类或抽象类,但是抽象类可以继承抽象类和普通类。
现在我们来定义一个轿车和自行车的启动方式
如果用抽象类
abstract class Car{
public abstract void gas();
}
abstract class Cycle{
public abstract void manPower();
}
现在有一个人既想开轿车又想骑自行车,用抽象类就实现不了了
但是用接口就非常容易。
interface Car{
public void gas();
}
interface Cycle{
public void manPower();
}
class Person implements Car,Cycle{
public void gas(){}
public void manPower(){}
}
2. 在抽象类中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的
3. 抽象类中可以有非抽象方法。子类可以选择继承该非抽象方法,也可以选择继承。但接口中则不能有实现方法,且接口中所有的抽象方法都必须被实现。
4. 接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。
5. 抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。
6. 接口中的方法默认都是 public,abstract 类型的
7. .abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。