抽象类和接口的比较

来源:互联网 发布:有道云协作下载 mac 编辑:程序博客网 时间:2024/06/07 02:03

java中的接口和抽象类

接口和抽象类是Java两种重要的机制,具体的内容很多,现在只从抽象方法的角度来对两者做一下比较。

相同点:
  A  接口和抽象类都不能生成实例,都不能被实例化
  B  接口和抽象类都拥有抽象方法(一个或多个)。
  
  
不同点:
  A  接口中的方法都是公有的、抽象的方法(public abstract 方法名();  , publlic abstract 即使不写,系统也会默认添加,不过按照目前的编程习惯,public 还是要写出来的。static 如果写出来编译就会报错,“此处不允许使用修饰符static ”,这也就决定了接口中不可能有main()方法,做不了应用程序,连自己的测试都做不了。在接口中写了public static void main(String[] args){  System.out.println("===");} 编译会提示“此处不允许使用修饰符 static ”和 “接口方法中不能带有主体”。虽然不能有自己的方法体,接口中的方法还是可有有自己的参数列表的);
     抽象类中有抽象方法,也可以有非抽象方法(正常的方法)。

  B  接口中的所有属性都是静态常量的(static final 即使不写;系统也会默认添加。至于权限,我没有看到有人说必须是public 或系统默认添加public ,但我试验之后认为系统会默认在属性前添加一个public 。在我的试验中,权限改为private ,改成protected ,系编译都会报错“此处不允许使用修饰符……”,但缺省之后却可以正常编译,根据四种修饰符的权限,绝对不应该是public 和 default 两个可以修饰和protected 去不可以修饰的,因此我认为此处的缺省,系统默认添加了public 权限。现在再看接口中的属性,就应该是public static final 属性=属性值; );
     抽象类中可有任何一种属性。

  C  接口中没有构造器(它的实现由类来实现,本身不需要实例),在方法领域只有一大堆抽象方法,没有构造方法;
     抽象类中有构造器(从从抽象类没有实例的角度来考虑,抽象类也是不应该有构造器的,但由于抽象类中有正常的属性和初始化,构造器的需要也变得必要了)。
     接口中没有构造器 。(后头看一下接口中的构造器,接口中也是允许有自己的属性的,但由于接口中的属性都是一些静态的常量,没有了每次调用构造器构造的必要,接口中也就没有了构造器 ???)  

D    一个类可以实现多个接口,一个接口可以继承多个接口;
     一个类只能继承一个抽象类,一个抽象类也只能继承一个抽象类。一句话,java中类的继承是单继承,一个类(不论是抽象的类还是正常的类)最多能继承一个类(不论是抽象的类还是正常的类)
E   抽象类中可以实现接口,从而衍生处一大堆东西。(因为接口中可以有正常的方法,有正常的方法就可以实现接口);
    接口是不能继承抽象类的;


总结:
    抽象类和接口的讨论我们是在抽象方法的层次上进行的。
    从本质上说,抽象类首先是一个类,具有类的特征和功能。在类的基础上有了一些抽象的方法和一些抽象的属性(按照这样的逻辑继续往下走,抽象类从语法上来分析也可以有抽象的构造器的,但试验后就会发现,情况并非这样,在抽象类中添加一个抽象的构造器,可以是有参的,可以是无参的,编译会报错“此处不允许使用修饰符 abstract ”)   
    接口更倾向于看成一个抽象方法的集合体(java中允许接口中有公共的静态的最终的常量先不考虑),看成一个功能环,虽然不能提供具体的功能,但至少给出了功能的实现思路、指出了功能未来的走...

原创粉丝点击