手记

详细解析Java中抽象类和接口的区别

  最近在慕课网的java教程看到了抽象类与接口的课程。

 正好我学到这里,结合自己的课程,又查找了一些互联网资料,多方综合,简单的总结如下。

   抽象类其实就是特殊的父类,用abstract标注修饰了而已。我们可以按照父类的概念理解所谓抽象类。

  所不同的是,抽象类比一般的父类对子类有了一种强制约束性行为。也就是子类必须重写抽象类中的所有抽象方法。

   而且即使抽象类中没有一个抽象方法也可以修饰为抽象类,这是为了保护自己不被new实例化创建对象。就这两点的最为重要,其他的都可以按照父类来理解。甚至如果没有这两点,基本上抽象类可以喝父类相互转化。

    写成抽象类,父类都可以。当然如果你实在懒得想省去方法体那对可爱的大括号,当然还可以省略public。也可以尽量都写成抽象类。


    至于接口则完全跟抽象类有着本质的区别,可是只是因为形式上看着类似,编写教材的就把他们放在一起学习,对此行为我实在是深恶痛绝。可是没有办法,已经这样学了。

    所以我总结接口还是不要说起两者形式上的类似于区别了,甚至不要提起抽象类的好。免得混淆了大家。还是略过抽象类,从父类继承等说起的好。

    继承的好处不用多说,用了都说好,可是有一大限制,就是只能继承一个父类,也就是俗话说的一个人只能有一个爹。

    现实虽是如此,可是娱乐圈的贵人们早就想好了迂回路线,拜个干爹。这样就不仅可以继承生父的财产,还能迂回继承其他人的影响与势力。

    不仅娱乐圈如此,社会各方面都是如此。回到我们学生身上。学生虽然只有一个父类,但是因为所学专业,课程,努力程度,时间等等的不同,导致学生与学生之间的差距非常大。
    就比如学习机械的与学习编程的学生之间的能力差异化非常大。
    学习机械的。要回材料学,力学,动力学,物理学,化学,热处理,制图等等。而学习编程的要之间也有很大的差距,有学习java的,有学习C++的,有学习sql的等等。他们之间因为各种不同而具有不同的能力。

简单的概括。

面向对象的父子继承类是is a关系,也就是谁是谁的关系。
而接口是has a的关系,也就是谁有什么的关系。

    对照现实,如果类与对象更像一个实体,而接口更像是一种能力。比如我们自己只能有一个,但是却可以有无限制的能力。这就是接口突破继承有且只有一个的限制的伟大创举。

   前辈告诉我,虽然面向对象的思想很伟大,但说实话对象就那么几个,可是能力功能却很多。用到接口的地方比之对象父子类多得多。这两者几乎成为的两个体系。

一个是面向对象的编程,一个是面向接口的编程。
所以学好接口比面向对象更重要。

   但是接口存在于对象身上,只有存在对象,才有可能存在众多的接口,所以对象又称为接口的实现基础。就好比我们,只有存在,才能去学习实现各种各样的能力。

   一个接口可以是一种能力。比如你可以定义一个借口interface 拥有java 的能力。然后一个对象拥有这种能力,只需要加一个现实接口的关键词implements就行。

    当然一个对象肯定是先要继承父类自己存在然后才能去实现接口,所以extends继承在前,implements实现在后。

   我们说了接口的而好处就是拜托了只能继承一个的限制,所以一个对象可以实现n个接口,每个接口之间只需要“,”号隔开就行。

      就这么简单,更深一步。无数的对象之间有共性的东西,于是抽象出了一个父类,同样无数的接口也有共性的东西,我们也能抽象出一个个接口的父类。于是接口也具有的父子继承类的属性。

    这样一来大家就可以把类与对象的三大特性封装,继承,多态往接口身上套了。一套一个准。

接口的父类还是叫做接口,但是接口的子类就不是接口了,而是接口的实现类,要注意此事已经不能用interface来修饰了,要用回class类来修饰。

对照着面向对象我们一一来解释接口的特性。

首先属性:

   接口的属性只能是常量,且赋值了的常量。不能定义变量,他前面有个默认的修饰符串“public static final”从这三个默认的修饰符就能明白接口的常量属性的特性。公有的的访问权限,属于全体所有的静态常量,不变的常量。就比如圆周率π一样。

    这三个修饰符是可以任意条换位置的。况且这三个修饰符本来就是默认隐藏的,所以不用管它。我们只需要知道接口的属性是静态全局常量就行。而且不要忘了,常量变量名为全部大写。

接着方法:

    所有的方法都是抽象方法,都必须被实现。被重写。因为要被子类继承改写所有的方法,所以默认的就只能是public。有没有public都一样。所以也就没必要封装了。

   因为接口中所有的方法都是抽象方法,所以可以不写abstract ,当然也可以不写方法体与可爱的花括号。

    接口既然要的就是继承,所以就没有实例化的必要和意义,也就不能被实例化。

   接口中不能有构造方法,因为构造方法必然对属性进行初始化,而接口中的属性值已经有了,且是不变的常量。所以没有构造方法存在的必要。当然同接口名的普通方法不在此列,比如加一个void。就变成了普通方法,这样也可以省去我们重新起名字的麻烦。毕竟很多时候接口名基本上就是方法名相同的意思。起一个名字更轻松一些。

说完封装我们说继承。

     接口之间可以通过extends实现继承关系,就好比一个接口继承另一个接口,而且还能保持接口最大的特色,就是不受类继承数量的限制,可以继承多个接口,但是一定不要继承类。毕节类中有变量属性与一帮方法,而继承来了,集合自身的常量属性以及抽象方法矛盾,所以一定要记着接口不能继承类。

说完继承我们说多态。

接口可以实现多态。还可以和父子类实现多态组合。嵌套多态。玩出花样来。

    最简单的实现多态的办法就是讲父类接口作为类型,顶一个个接口类型的变量作为类或对象的属性。

     然后如同类中一般的变量一样私有化属性,设置set/get方法。Set方法传递参数,参数类型就是父类接口,实参就是子类接口。这样就实现了接口的多态。

   如果还是不能理解接口,我在举一个小例子。

   一台电脑是一个对象,它本身有很多功能。可是他还想拥有更多的功能。可是他本身的限制让他无法竖向更多的功能,如今usb父类接口出现了。通过usb接口可以实现很多外设。这些外设都可以算是usb接口的实现类。

   比如usb春存储器,usbwifi。Usb监控,usb风扇,usb点灯。Usb键盘鼠标等等,一个小小的usb接口就可以让一台电脑瞬间突破功能的限制,实现更多的功能。

  这就是接口,特别是父类接口以及实现类的好处。

    最后我们如果理解了接口。那么就可以回过头来看一下抽象类与接口形式上的异同了。

26人推荐
随时随地看视频
慕课网APP

热门评论

总结的很好,我对接口有了新的认识

查看全部评论