您现在的位置: 首页 > 网站导航收录 > 百科知识百科知识
如何理解java的抽象类和接口的区别?
方法,抽象,接口如何理解java的抽象类和接口的区别?
发布时间:2020-12-06加入收藏来源:互联网点击:
问题补充: 不要说表面上的区别,实现接口要实现接口中的所有方法等,说本质区别,以及在实际中如何使用?
回答于 2019-09-11 08:43:50
回答于 2019-09-11 08:43:50
首先,来理解一下抽象类和接口的概念。
众所周知,Java是面向对象的程序语言,而面向对象中的所有的对象,大都是通过类来描述的。相反,并不是所有的类都适合来描述对象,比如抽象类。抽象类中没有足够的信息来描述一个具体的对象,所以它是抽象的。
而接口,是高度抽象类型,是抽象方法的集合,接口并不是类,而是对类的一组需求的描述。这些类要遵循接口描述的统一格式来定义。如果类遵从了某个特定接口,就代表它履行了这项服务。
然后,来理解一下抽象类和接口的相同点。
其一,都不能被实例化。
其二,接口只有在其实现类实现了其中所有的方法、抽象类的子类也都实现了所有的抽象方法后,才可以被实例化。
再然后,来理解一下抽象类和接口的不同点。
抽象类:
abstract关键字修饰抽象方法只有声明,无方法体只能继承不能实例化包含抽象方法的类一定是抽象类,但抽象类不一定包含抽象方法抽象类中的抽象方法的修饰符只能是public或者protected,默认为public一个类只能继承一个抽象类子类继承抽象类时,必须实现全部的抽象方法,否则也必须为抽象类可以包含成员变量、成员方法、构造方法;但是构造方法不能用于实例化,只是供子类调用如抽象类Animal,有成员属性name、构造方法:
接口:
interface关键字修饰方法只能有声明,不能有方法体,默认为public abstract。JDK1.8之后,可以有default类型的方法,可以有方法体只能实现不能实例化所有方法只能是public abstract。JDK1.8之后,可以有default类型的方法,可以有方法体一个类可以实现多个接口可以包含变量,但隐式默认为public static finalJDK1.8中的新特性,新增了默认方法(default):允许接口含有非抽象的方法,但必须用default修饰;default方法可以子类调用,子类也可不比对其实现;如子类实现了多个接口,且这些接口均包含有默认方法,则子类必须重写该默认方法。新增了静态方法:允许接口使用static关键字修饰方法并提供实现,即为静态方法;接口的静态方法只能通过接口进行调用,调用方式为:接口名:方法名。如接口Climb,通用行为climb:
举个栗子,Cat类继承Animal、且实现Climb,具有动物特性和攀爬行为:
运行一下,看一下调用顺序和结果。
果然,先调用了抽象父类的构造方法,然后是子类的构造方法。
最后,来总结一下抽象类和接口。
接口的设计目的为:对类的行为进行约束,是一种通用的行为规范;
抽象类的设计目的为:类的通用模板,提高代码复用性。
回答于 2019-09-11 08:43:50
下面是本人一知半解,如有错漏,希望多多包涵:
区别:
抽象类:部分抽象接口:全部抽象Java包括其他面向对象语言中有继承(-》),继承就有父类、子类,其中父类的作用是什么呢?是为子类提供统一的调用途径,抽象出子类共有的方法,避免子类方法的重复定义。而父类的方法,直接实例化去掉用往往是没有什么意义的,因为我门大多通过重写父类方法来实现子类方法各种特有的功能。
那么怎么才能约束人们不要轻易调用父类方法,并能更好的约束子类的行为呢?答案是“抽象方法”。抽象方法是不完整的方法,它无法直接使用,编译器也能提前知道这个类是抽象类,如果没带关键字abstract 就给你报个错。而且字类必须实现这个抽象方法,这样就能规范字类的行为啦。但这里有个BUG,含有抽象方法的类,叫抽象类,抽象类中可以有普通方法。
如果更进一步,将所有方法都换成抽象方法,那么这个类就可以不叫类了,叫接口。换个关键字interface(互脸)。接口是个好东西,接口比抽象类更加抽象,可以更好的约束实现类的行为。一个类实现了接口,还可以实现另一个接口,而一个类继承了抽象类,就不能继承其他类啦。这样我们通过接口,就可以近似的实现多继承了。接口还可以实现完全解耦,而抽象类就不能。
总的来说,接口虽然只是更加纯粹的抽象类,但接口更加灵活。至于如何使用接口和抽象类,那就要看项目需求是什么了,如果没有十分必要的情况,还是优先选择类,因为接口的灵活性,使得系统复杂性有时会显著上升。
回答于 2019-09-11 08:43:50
抽象类
抽象类必须用 abstract 修饰,子类必须实现抽象类中的抽象方法,如果有未实现的,那么子类也必须用 abstract 修饰。抽象类默认的权限修饰符为 public,可以定义为 public 或 procted,如果定义为 private,那么子类则无法继承,抽象类不能创建对象。
接口
接口中的变量隐式的使用 public static final修饰,并且需要给出初始值。方法隐式的使用 public abstract 修饰(并且只能是 public ,如果是 private,procted,那么就编译报错)。接口中的方法默认不能有具体的实现(JDK1.8开始可以有默认的实现)
抽象类和普通类的区别
抽象类必须用public、procted 修饰(如果为private修饰,那么子类则无法继承,也就无法实现其抽象方法)。默认缺省为 public抽象类无法创建对象如果一个子类继承抽象类,那么必须实现其所有的抽象方法。如果有未实现的抽象方法,那么必须定义为 abstract下一篇:返回列表
相关链接 |
||
网友回复(共有 0 条回复) |