抽象类与接口

抽象类

  在引入抽象类的概念之前,我们可以试想一下生活当中的某些例子。比如我们在描述某个图形的时候,像三角形之类的图形我么可以直接具体的描述它们有几条边,几个角,这些描述都是合乎情理的。但是对于某些图形,我们并不能直接描述它们的具体边角情况,只能大概的描述一下这个似乎存在的图形,那么对于这种事物的描述,在Java当中就需要使用到抽象类
  在解决实际问题时,一般将父类定义为抽象类,需要使用这个父类进行继承与多态处理。我们很容易理解这一点,在继承树当中,越是在上方的类就描述的越概括越抽象,而在这些类下方的类相对来说就越具体。同时,我们在学习了之前的多态机制可以了解到,在多态机制当中,并不需要将父类初始化对象,我们需要的只是子类对象,所以在Java语言中设置抽象类不可以实例化对象。
抽象类的语法格式:

public abstract class Test{
	abstract void testAbstract();//定义抽象方法
} 

  其中,abstract是定义抽象类的关键字。
  使用abstract关键字定义的类称为抽象类,而使用这个关键字定义的方法为抽象方法,就父类来说,这个方法没有任何意义,除非它被子类继承而又被重写。同时,承载这个抽象方法的抽象类必须被继承,实际上抽象类除了被继承之外没有任何意义。
抽象类总结:

  1. 什么是抽象类?

  对于抽象类的概念简单来说就是:类和类之间具有共同特征,将这些共同特征提取出来,形成的就是抽象类。我们知道,从类到对象是实例化,那么从对象到类就是抽象。

  1. 抽象类和普通类一样,都属于引用数据类型。

  2. 抽象类是无法实例化的,无法创建对象,所以抽象类是用来被子类继承的。

  3. final和abstract是对立的,不能联合使用。

  4. 抽象类可以有构造方法吗?

  抽象类虽然无法实例化,无法创建对象,但是抽象类是有构造方法的,主要是供子类使用来初始化抽象类的成员。

  1. 抽象方法表示没有实现的方法,也即没有方法体的方法。
  2. 抽象类中不一定有抽象方法,含有抽象方法的类一定是抽象类。
  3. 若一个非抽象类继承了抽象类,则必须将抽象类当中的所有抽象方法实现。

接口

  为什么要引入接口的概念呢?我们刚刚学习了抽象类的相关语法规则,其中有一点语法规则是这样说的,“若一个非抽象类继承了抽象类,则必须将抽象类当中的所有抽象方法实现”。我们可以设想这样的一种情况:父类A是一个抽象类,并且包含一个抽象方法function,现在有另外的三个类B、C、D继承了抽象类A,那么在类B、C、D当中必须都要实现抽象方法function,即便可能B、C、D当中存在某些类并不需要使用这个function方法,这样看来,程序当中就会导致有许多的冗余代码,面临这样问题,接口的概念就出现了。
接口简介
  接口是抽象类的延伸,可以将它看作是纯粹的抽象类,接口中的所有方法都没有方法体。说到底呢,接口的本质还是一个类。
接口的语法格式:
  [修饰符列表] interface 接口名{
}
其中,定义一个接口使用的关键字是interface,一个类实现一个接口可以使用implements关键字。
继承父类A的子类B实现接口C的语法格式为:
  [修饰符列表] class B extends A implements C{
}
注意:extends在前,implements在后。

接口总结:

  1. 接口实质上就是一个类,因此接口是一种引用数据类型。
  2. 接口是完全抽象的,或者我们也可以说接口是一种特殊的抽象类,而抽象类是半抽象的,抽象类当中还可以有非抽象方法。
  3. 接口当中只包含两部分内容,一部分是常量,另一部分是抽象方法。
  4. 接口中的所有元素都是public修饰的,都是公开的,即便不写public修饰符也默认是public的。
  5. 在接口中定义抽象方法时,public abstract可以省略。
  6. 接口中的方法都是抽象方法,因此接口中的方法都没有方法体。
  7. 当一个非抽象类实现接口的话,必须将接口当中的所有抽象方法全部实现(覆盖/重写)。
  8. 接口和接口之间可以实现多继承,一个类可以同时实现多个接口,这个机制是为了弥补Java中的类之间的单继承的。
  9. 接口和接口之间在进行强制类型转换的时候,即便没有继承关系,也可以强制转换,但是可能出现classCastException异常。
  10. 接口是完全抽象的,接口当中没有构造方法 。

看完本期博客我们需要思考的问题有:
1.Java语言当中凡是没有方法体的方法都是抽象方法吗?
2.抽象类可以实现接口吗?


Tips:解答如下:
  1.这个说法显然是错误的,我们翻阅JDK源码可以发现,在Object类当中就有很多方法是没有方法体的,都是直接以 ; 结尾,这些方法的底层调用了C++写的动态链接库程序,并不是抽象方法。
  2.抽象类当然可以实现接口,只是通常并不需要这样做,接口当中的方法可以由抽象类的子类来实现。


以上内容均为个人学习的一点心得,其中的知识点若有错误请留言提醒,若有侵权内容提醒马上删除。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值