黑马程序员技术交流社区
标题: abstract class和interface有什么区别? [打印本页]
作者: 李九一 时间: 2013-6-29 10:04
标题: abstract class和interface有什么区别?
声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。
接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。
作者: 王楚鑫 时间: 2013-6-29 11:57
本帖最后由 王楚鑫 于 2013-6-29 11:59 编辑
下面是我总结的、一起探讨一下吧、、、、不足之处、多多指教啊
相似处:
1.interface的方法全部都没有“实现部分”(body区);
而abstract类能拥有abstract方法,这些方法也都没有“实现部分”(body区);
2. interface和abstract类都不能直接用来建立对象实例,必须由一个标准的“一般类”去继承它(implements或extends),实现这些没有“实现部分”(body区)的方法,然后再以次“一般类”建立对象实例。
差异处:
1.interface没有构造函数;但abstract类有构造函数。
2.interface不允许其内任何方法拥有“实现部分”;但abstract类允许拥有一般非abstract的方法
,它们就一定有“实现部分“。
3.interface没有内置的super和this变量;abstract类则有。
4.interface的成员变量一定是常数(final的变量);但abstract类的成员变量,皆按照标准的一般类的成员变量。
5.interface所有成员的封装等级都是public,故定义成员时不可加public之外的其他封装修饰符;但abstract类的成员可以是任何封装等级,也就是它的成员可加任何封装修饰符。
还有代码- /*
- 创建一个抽象类Draw,在抽象类中定义一个名称为drawRect()的抽象方法,再创建此
- 抽象类的子类Exampl,练习抽象类的使用。
- ps:在创建抽象类时,要使用abstract关键字来定义抽象类。
- 抽象类中定义抽象方法,同样需要使用abstract关键字来定义。
- 继承抽象类,必须重写抽象类中所有抽象方法。*/
- abstract class Draw { //定义抽象类
- public abstract void drawRect(double w,double h);
- }
- public class Exampl extends Draw{ //实现抽象类
- public void drawRect(double w,double h){
- System.out.println("矩形的宽和高分别是:"+w+"和"+h);
- }
- public static void main(String[] args){
- Exampl ex=new Exampl();
- ex.drawRect(100,50); //调用方法输出矩形的宽和高
- }
- }
复制代码- /*
- 创建一个接口,在该接口中定义一个计算面积的getArea()方法,然后创建一个引用实现接口的类,在方法getArea()中实现面积的计算。
- 定义接口需要使用关键字interface
- 接口中的方法都是抽象方法。不包含方法体。
- 要实现接口需要使用implements关键字。
- 实现接口必须重写接口中的所有方法。*/
- interface Area {
- public double getArea(double r);
- }
- public class Exampla implements Area { // 创建引用接口的类
- private double r = 0f; // 声明半径
- private double getR() {
- return r;
- }
- private void setR(double r) {
- this.r = r;
- }
- public double getArea(double r) { // 实现接口中的方法
- double area = Math.PI * r * r;
- return area;
- }
- public static void main(String[] args) {
- Exampla ex = new Exampla();
- ex.setR(10.0); // 为半径赋值
- System.out.println("半径是" + ex.getR() + "的圆的面积是:"
- + ex.getArea(ex.getR()));
- }
- }
复制代码 。
。
。
。
。
。
。
。
我上午还做了个代码,在类中实现多接口的引用,,,分享一下- /*
- 建立两个接口,每个接口中各定义一个方法,创建一个类,使该类引用这两个接口,练习多接口的引用。
- ps: 类实现接口,必须使用关键字implements
- Java中不可以同时继承两个类,但是可以同时实现多个接口,要实现的接口之间使用逗号分隔。
- */
- interface Move{ //定义接口Move
- public void startMove(String move);
- }
- interface Speak{ //定义接口Speak
- public void startSpeak(String speak);
- }
- public class Examplc implements Move,Speak{
- public void startMove(String move){ //实现接口Move中的方法
- System.out.println(move);
- }
- public void startSpeak(String speak){ //实现接口Speak中的方法
- System.out.println(speak);
- }
- public static void main(String[] args){
- Examplc ex=new Examplc();
- ex.startMove("开始移动了......");
- ex.startSpeak("开始说话了......");
- }
- }
复制代码
作者: 神之梦 时间: 2013-6-29 14:54
鉴于跟你昨天的帖子内容基本一样, 就不加分咯:lol
作者: 神之梦 时间: 2013-6-29 14:59
楼主的内容属于总结分享,在选择主题时可选“感言”或者“资源分享”,因为昨天楼上已经发表过类似的总结帖,且相对较为详尽(有代码),所以加点金币鼓励下
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |