Java中接口和抽象类的区别你真的清楚吗?

来源:互联网 发布:seo免费优化工具 编辑:程序博客网 时间:2024/06/09 14:27


一、引言

      Java中抽象类和接口的区别你的真的全部知道吗?今天看见一片CSDN首页博文,感觉他总结的不是很好,于是自己亲自总结一下,结果发现很多意想不到的情况。那么先列一列总结出来的区别吧,这些你都知道吗?:

         (1)抽象类单继承、接口多实现


         (2)接口的所有成员变量都必须是public(默认会加上public static),抽象类抽象方法必须是public,其他随意


         (2)对方法来说:

                      接口中的方法都需要是抽象的,不能用private修饰,其方法不需要手动加上abstract
                      抽象类的方法不一定是抽象的,抽象方法需要手动添加abstract修饰符,抽象类可以有私有非抽象方法。


         (3)就实例化来说:抽象类和接口都可以通过new的方式得到实例,不过都属于Anonymous InnerType类型


         (4)对于属性来说:接口只能包含初始化过的属性,抽象类随意。

        

         (5)对于常量来说:接口和抽象类都可以包含常量,只是接口必须是public而已

           

         (6)对于继承和实现来说:抽象类可以继承其他类,可以实现其他接口;接口可以多继承其他接口(震惊!!!),多继承代码如下:

//接口可以多继承public interface tet1 extends DialogInterface.OnClickListener, DialogInterface.OnCancelListener {}


二、用代码说话

      (1)首先定义一个抽象类,代码如下,本人用注释写了其特性:

//可以看到抽象类既可以继承,也可以实现其他接口public abstract class Test_abstract extends Money implements Test2_interface {//可以包含初始化的属性,公有私有都可以 public int a=5; private int a2=6;  //可以包含没有初始化的属性,共有私有都可以 public int b;  private int c; //可以包含常量,这个必须初始化,共有私有都可以 public final int d=7; private final int e=6;  //可以包含抽象方法,这个是基本属性,不能用private修饰    abstract int method();public abstract void m();//可以包含非抽象方法,共有私有都可以private void youtu(){};public void jiujiu(){};}


  (2)再定义一个接口,代码如下:
public interface Test_interface extends Test2_interface {     //可以包含初始化的属性,只能是public public int a=5; private int a2=6; //出错  //不能包含没有初始化的属性 public int b;  //出错  //可以包含常量,这个必须初始化,只能是public public final int d=7; private final int e=6;  //出错  //可以包含抽象方法,这个是基本属性,不能用private修饰,可以不手动加abstract修饰符     int method();public abstract void m();//不能包含非抽象方法    private void youtu(){};  //出错public void jiujiu(){};  //出错}

  (3)定义一个Main类,验证其能否被new出来,代码如下(如果实践,请先把上面报错的代码注释):

public class Main {public static void main(String[] args) throws Exception {//new了一个抽象类 Anonymous InnerTypeTest_abstract m=new Test_abstract() {@Overrideint method() {//匿名的类可以用this访问公有的任何成员this.a=1;return 0;}@Overridepublic void m() {}};//new了一个接口  Anonymous InnerTypeTest_interface x= new Test_interface() {@Overridepublic int method() {//匿名的类可以用this访问公有的任何成员int x=this.d;return 0;}@Overridepublic void m() {}};}}


三、小结

      上面是本人总结的几条规则,其实更应该从Java设计方面去思考,为什么抽象类和接口有这些区别。这样就脱离的死记硬背了。

      如有错漏之处,请留言指出!


0 0