【软件构造HIT】抽象类和接口的语法规则区别+对于其深层抽象设计思想的思考

Java抽象类与接口的区别

  • 问题提出

在Java中,抽象类和接口都不能被实例化。在最初的Java中,抽象类中可以有方法的实现,也可以有只有定义没有实现的抽象方法供继承它的子类来实现;接口中只能有方法的定义,但不能有方法的实现。但是随着Java的不断发展,也允许接口实现其静态方法,并且允许接口中可以实现缺省的default方法。这样的话抽象类和接口相似程度也就更大,但是它们之间在实际应用中真的完全一样吗?本篇我们来深入思考一下抽象类和接口在设计思想层面有什么不同。

  • 抽象类的概念与特点
  1. 抽象类的语法规则
  1. 抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象。
  2. 抽象类要被子类继承。
  3. 抽象类中可以做方法申明,也可以做方法实现。
  4. 抽象类中的变量是普通变量。
  5. 抽象方法只能申明,不能实现。abstract void abc();不能写成abstract void abc(){}。
  6. 抽象类里可以没有抽象方法
  7. 如果一个类里有抽象方法,那么这个类只能是抽象
  8. 抽象方法要被实现,所以不能是静态的,也不能是私有的
  1. 抽象类应用的具体场景举例

假设我们有一个Animal类来表示所有的动物,在它之下有许多不同种类的动物,如猫,狗,兔子等。那么我们就可以使猫,狗,兔子继承Animal类。但是我们在实际生活中,我们不会使用这样一个抽象的Animal类的实例,不能用new创建一个Animal对象,比如我只和朋友说我养了一个动物,那么朋友一定会一头雾水(你到底养了个什么动物?);或者我和朋友约着一起出去玩,我会说咱们今天去撸猫/狗,不会说走吧咱们今天去撸个动物(小心把朋友急死)。也就是说,我们是不希望有一个具体的Animal对象的,Animal对象应该是不可以被实例化的,在这种应用场景下我们就可以把Animal这个类定义成抽象类,抽象的目的是为了概括这些具体动物的共性。

假设我们还有另一个抽象类Plants,是所有植物的抽象概念:

那么由于Java不允许多继承,如果有一种动物,那么它就只能继承抽象类Animal;如果有一种植物,那么它就继承抽象类Plants。这是抽象类与接口的一个比较大的区别,因为Java不允许多继承,但是允许多实现,在之后对比时详细说明。

  • 接口的概念与特点
  1. 接口的语法规则
  1. 接口变量必须指向实现所有接口方法的类对象。
  2. 接口要被类实现。
  3. 接口只能做方法申明。
  4. 接口里定义的变量只能是公共的静态的常量。
  5. 接口可继承接口,并可多继承接口。

  • 抽象类和接口的区别
  • 语法规则上的区别

        设计思想上的区别

下面交流一下本人对于抽象类和接口在设计方法层面的区别,个人认为这也是抽象类和接口本质上更重要的区别。

本文中Animal是一个抽象类,抽象类是对具体的事物进行抽象。此处我们对于猫,狗,兔子进行了一种抽象,把他们概括成抽象类Animal。但是,接口不是对具体事物的抽象。接口是对动作、行为进行抽象。在接口中可以定义Animal的动作,Animal可以吃、跑、睡觉,但是全部都是针对行为,在接口中我们不会写Animal的年龄等属性。我们用接口抽象的是行为,比如如果我们要抽象动物的行为,可以抽象出吃接口,跑接口,睡觉接口,在具体的类可以实现多个接口,在具体类中完成对吃,跑,睡觉的实现。而抽象类是对事物的本质进行的抽象,如果有一个类Dog,那么它抽象的事物的本质就是Animal,所以它只能继承Animal这个抽象类。

但个人感觉还是难以想出更多的实际实例来解释其中的区别,期待大家的批评指正与补充。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值