本帖最后由 clevergump 于 2014-10-1 14:38 编辑
一. 楼主所说的
“抽象类可以定义方法体,接口不可以”是指:抽象类中可以有非抽象方法,而接口不可以。
“抽象类可以定义普通的方法属性,接口不可以”是指:抽象类中的属性可以不是 public static final 的,方法可以不是 public abstract 的,而接口中的属性方法却必须是。
二. 总结一下我所知道的二者的区别如下(鉴于水平经验有限,希望其他朋友帮忙补充,总结有误之处也希望其他朋友帮忙指出):
1. 继承实现角度:抽象类属于类,所以只能单继承其他类,也只能被其他类单继承,而接口能被类多实现,接口也能多继承多个接口。
2. 成员修饰符角度:抽象类中的成员属性可以被所有成员属性修饰符修饰(包括:private、protected、public、static、final以及默认修饰符),抽象类中的成员方法可以被所有成员方法修饰符修饰(包括前面括号中提到的所有成员属性修饰符、以及abstract,但abstract不能与static、final同时修饰方法),以上提到的这些修饰符都不具有强制性,可以使用,也可以不使用; 而接口中强制要求属性必须被 public static final 修饰(表示公开常量),方法必须被 public abstract 修饰,即使不显式地加上这些修饰符也会被系统默认隐式地强制加上。
3. 方法的功能角度:抽象类或者更广泛地说,一个类中的方法通常表示该类所描述的事物所具备的基本功能,而接口中定义的方法,通常通过使用一个类实现该接口并复写其中的方法来调用,该方法表示该实现类所描述的事物具备的扩展功能,而非基本功能。用毕老师的话说,就是类中的方法可以说成是这个类 is a (具有)方法所代表的功能,而接口中的方法可以说成是该接口实现类 is like(像) 该方法所代表的功能。
我的水平有限,知道的就这么多,可能有些地方描述有误,希望其他朋友也多指正,谢谢! |