使用abstract class的方式定义Demo抽象类的方式如下: abstract class Demo { abstract void method1(); abstract void method2(); … } 使用interface的方式定义Demo抽象类的方式如下: interface Demo { void method1(); void method2(); … } 在abstract class方式中,Demo可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface方式的实现中,Demo只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在interface中一般不定义数据成员),所有的成员方法都是abstract的 。从某种意义上说,interface是一种特殊形式的abstract class 。
从编程的角度来看,abstract class和interface都可以用来实现"design by contract"的思想 。但是在具体的使用上面还是有一些区别的 。
首先,abstract class在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系 。但是,一个类却可以实现多个interface 。
也许,这是Java语言的设计者在考虑Java对于多重继承的支持方面的一种折中考虑吧 。其次,在abstract class的定义中,我们可以赋予方法的默认行为 。
但是在interface的定义中,方法却不能拥有默认行为,为了绕过这个限制,必须使用委托,但是这会 增加一些复杂性,有时会造成很大的麻烦 。在抽象类中不能定义默认行为还存在另一个比较严重的问题,那就是可能会造成维护上的麻烦 。
因为如果后来想修改类的界面(一般通过abstract class或者interface来表示)以适应新的情况(比如,添加新的方法或者给已用的方法中添加新的参数)时,就会非常的麻烦,可能要花费很多的时间(对于派生类很多的情况,尤为如此) 。但是如果界面是通过abstract class来实现的,那么可能就只需要修改定义在abstract class中的默认行为就可以了 。
同样,如果不能在抽象类中定义默认行为,就会导致同样的方法实现出现在该抽象类的每一个派生类中,违反了"one rule,one place"原则,造成代码重复,同样不利于以后的维护 。因此,在abstract class和interface间进行选择时要非常的小心 。
从设计理念层面看abstract class和interface 上面主要从语法定义和编程的角度论述了abstract class和interface的区别,这些层 。
3. abstract怎么写 abstract(抽象)修饰符,可以修饰类和方法
1,abstract修饰类,会使这个类成为一个抽象类,这个类将不能生成对象实例,但可以做为对象变量声明的类型,也就是编译时类型,抽象类就像当于一类的半成品,需要子类继承并覆盖其中的抽象方法 。
2,abstract修饰方法,会使这个方法变成抽象方法,也就是只有声明(定义)而没有实现,实现部分以";"代替 。需要子类继承实现(覆盖) 。
注意:有抽象方法的类一定是抽象类 。但是抽象类中不一定都是抽象方法,也可以全是具体方法 。
abstract修饰符在修饰类时必须放在类名前 。
abstract修饰方法就是要求其子类覆盖(实现)这个方法 。调用时可以以多态方式调用子类覆盖(实现)后的方法,也就是说抽象方法必须在其子类中实现,除非子类本身也是抽象类 。
注意:父类是抽象类,其中有抽象方法,那么子类继承父类,并把父类中的所有抽象方法都实现(覆盖)了,子类才有创建对象的实例的能力,否则子类也必须是抽象类 。抽象类中可以有构造方法,是子类在构造子类对象时需要调用的父类(抽象类)的构造方法 。
举个简单的例子下面有一个抽象类
abstract class E{
public abstract void show();//public abstract 可以省略
}
然后其它类如果继承它通常为了实现它里面的方法
class F extends E{