java中接口与抽象类的区别

来源:互联网 发布:淘宝七天下架 编辑:程序博客网 时间:2024/06/13 06:25
   接口和抽象类,大家应该都不陌生吧?这个无论是初学者还是一个老鸟都要经常面对的东西。还记得我当初学习java的时候,当时听了老师讲了半天也没怎么听懂,还记得为了加深理解老师把c++都搬了出来,可是自己当时早已经去和周公下棋了,哪有什么收获可言,不过学习了两年java了,把自己在这个过程中对一些java的理解就记下来吧,毕竟马上就要去工作了,还是要养成写博客的好习惯。话不多说,开讲了   结构上,抽象类中可以有各种变量(类比现实生活中的事物,你描绘一个事物有时候会需要一些数据),而接口中只能有public static final类型常量(你描述一个行为,但是你没有一个具体的对象,所以你不需要数据去描述它,况且你的这个方法现在根本没实现);其次,抽象类中可以有已经实现的方法(我们叫它默认方法,子类在继承的时候可以不用重写,也可以重写,不重写的话就用默认的),而接口中只有抽象方法,另外多说一句抽象类中可以没有抽象方法(没有现实意义了,我们也不会去用,这里只是语法上可以)。   语法上,一个非抽象类子类“继承”接口只能用implements去实现它,必须实现接口的每一个方法,一个抽象类“继承”接口时,则可以不用实现所有方法(显然的)用implements;子类在继承抽象类时,则都是使用extends,当然这里也有两种情况和接口一样就不说了。   另外不重开头为什么说老师把c++都搬出来,因为c++中没有接口这一概念,在c++中通过多继承来实现现实生活中那些复杂的事物关系,但是在调用的时候会出现误解问题,java为了避免这一缺陷,只允许单继承,那么如何表达现实生活中的复杂关系呢?于是接口就出现了。一个类允许同时实现多个方法已达到现实生活中那些具有多种功能的事物,那么接口又是怎么避免调用歧义呢?主要是他自身并没有实现这些方法,所以现在假设有接口D,其中有eat抽象方法,而接口A,B都继承D而且他们都有eat这个抽象方法,那么现在如果C同时 实现两者时,额额,难道有错?其实没错,如果此时你单独的利用C的对象来调用eat方法肯定不会有错,该是什么就是什么。但是如果你用D的对象调用呢?哈哈,这个时候也不会有错,因为在C中implements的A,B中都没有实现eat方法,这也就无所谓调用哪个了!你想想如果这要换成在c++中,由于子类继承父类的方法了,将会出现什么状况!   哈哈
原创粉丝点击