抽象类和接口在使用中的一些区别

论坛 期权论坛 脚本     
匿名技术用户   2020-12-28 13:41   11   0

最近在看Java基础,看到抽象类和接口,感到很不解,觉得没有什么区别,去网上查,又讲的太官方,最终找到了一片大白话能讲明白的文章。看完后总结出抽象类是一种概念,甚至可以说抽象类相当于类中的属性(不知道这样比喻恰不恰当),是提供概念上的东西,而接口相当于类中的方法,提供动作。

下面附上我说的那篇文章

概念:

抽象性和具体性都是相对的,不是绝对的。简单说,概念的内涵越小,则其抽象程度就越高,其外延也越大,反之亦然。比如“人”比“男人”抽象一点,而“生物”又比“人”更抽象一点,“物质”则比“生物”更抽象。

抽象的概念是由具体概念依其“共性”而产生的,把具体概念的诸多个性排出,集中描述其共性,就会产生一个抽象性的概念。抽象思维,是人类思维达到高级阶段产生的一种能力,例如,当小孩子思维尚未成熟时,他们只能掌握具体概念,他们在学习代词“你、我、他”时往往遇到困难,因为代词具有较高的抽象性。

总之,抽象概念的外延大,内涵小,具体概念的外延小,内涵大。

一、抽象类与普通类的区别:

1、普通类可以去实例化调用;抽象类不能被实例化,因为它是存在于一种概念而不非具体。

2、普通类和抽象类都可以被继承,但是抽象类被继承后子类必须重写继承的方法,除非自类也是抽象类。

看一个实例:

[java] view plain copy

  1. public class Pet {
  2. public void play(){ //这是宠物类,普通父类,方法里是空的
  3. }
  4. }
  5. --------------------------
  6. public class Cat extends Pet { //这是子类,是一个猫类,重写了父类方法
  7. public void play(){
  8. System.out.println("猫爬树");
  9. }
  10. }
  11. ------------------------
  12. public class Dog extends Pet { //这是子类,是一个狗类,重写了父类方法
  13. public void play(){
  14. System.out.println("狗啃骨头");
  15. }
  16. }
  17. -------------------------
  18. public class Test {
  19. public static void main(String[] args) { //这是测试类,分别调用了子类的不同方法
  20. Pet p1=new Dog(); //多典型的多态表现啊,相当的给力
  21. Pet p2=new Cat();
  22. p1.play();
  23. p2.play();
  24. }
  25. }

-----------------------
输出结果:
狗啃骨头
猫爬树
-----------------------
问题:把父类改成抽象类,方法改成抽象方法,那么
public void play();//抽象方法没方法体
子类不变,依然重写父类方法,那这个跟普通父类没区别啊?
难道说就一个抽象方法没方法体就完事了??那我普通方法有方法体,我空着不写内容不就得了,不跟抽象方法一个样吗??
别跟我说抽象类还不能实例化,哥也不需要去new它!
普通类都能搞定的,还弄个抽象类有什么意义?我前面都说了普通类的方法我可以空着不写,达到跟抽象类方法没方法体一样的效果。
既然两种方式都能达到同一个输出效果,弄一种方式不就得了,那为什么还要创造出一个抽象类出来?难道是比普通类看着舒服?用着爽?还是更加便捷?还是为了强制让别人用的时候必须强制化实现抽象方法省的你忘了什么的?

答:就是为了强制不能实例化,以及强制子类必须实现方法这不是你忘不忘的问题
你说你不去new它就行了,这话没错
那你想另一个问题,为什么要有访问控制呢?为什么要有private和public之分呢?
我可以全部public,不该访问的,我不访问就行了啊
小程序里,看不出什么区别,反而private成员要写一堆set和get函数,多麻烦,我自己写小程序的时候也会偷懒全部public
但是项目大了,代码多了,这种严谨的结构就很重要了
且不说会有很多人合作一起写一个程序,哪怕还是你一个人写,也保不住有忘记的时候,那时候编译器不报错,茫茫码海上哪找错误去
面向对象说到底就是方便你思考,模块化,易维护管理,硬要说没必要,整个面向对象都没必要了,C语言有什么干不了的呀,运行效率还高。

二、抽象类与接口的区别:

1、概念不一样。接口是对动作的抽象,抽象类是对本质的抽象。
抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,男人,女人,这两个类(如果是类的话……),他们的抽象类是人。说明,他们都是人。人可以吃东西,狗也可以吃东西,你可以把“吃东西”定义成一个接口,然后让这些类去实现它。
所以,在高级语言上,一个类只能继承一个类(抽象类)(正如人不可能同时是生物和非生物),但是可以实现多个接口(吃饭接口、走路接口)。

2、使用不一样:

a.抽象类 和 接口 都是用来抽象具体对象的. 但是接口的抽象级别最高
b.抽象类可以有具体的方法 和属性, 接口只能有抽象方法和不可变常量
c.抽象类主要用来抽象类别,接口主要用来抽象功能.
d.抽象类中,且不包含任何实现,派生类必须覆盖它们。接口中所有方法都必须是未实现的。

e.接口是设计的结果 ,抽象类是重构的结果

3、使用方向:当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。
注意:抽象类的功能要远超过接口,但是,定义抽象类的代价高。因为高级语言来说(从实际设计上来说也是)每个类只能继承一个类。在这个类中,你必须继承或编写出其所有子类的所有共性。虽然接口在功能上会弱化许多,但是它只是针对一个动作的描述。而且你可以在一个类中同时实现多个接口。在设计阶段会降低难度的。

原文链接:https://blog.csdn.net/csdn_aiyang/article/details/71171886

还有一篇

首先先了解一下什么是类,在这之前,我们需要了解一下java中对象的概念,其实java这种面向对象的程序语言就是为了描述我们所处的大千世界,那么java中的对象就是这个世界上一草一木的对应,比如我正在使用的这台电脑,我们寝室对面的一棵树等等,世界上每一个具体的东西都是一个对象,我想这也是java这种面向对象语言的由来。类呢?就是对对象的抽象化、概念化,用一个统一的代号来称呼具有相同特征的一堆对象,比如说:人类就是对我们人的统称,书就是对《java从入门到精通》《大话数据结构》等的统称。

了解了对象和类的基本概念后,接下来进入正题,我身边有两个兄弟,分别是笔记本电脑类和PC电脑类,他们有共同之处(都能上网打游戏),也有不同之处(笔记本方便携带,而PC就不行),但他们从小没有父亲,两个人相依相偎的游荡在这个世界上,有一天,他们找到了他们的亲生父亲-电脑类,他们开心极了,他们发现他们的父亲居然也能打游戏,他们终于想通了:打游戏这个功能是从父亲那里继承过来的,但他们又各自产生了一些变异,笔记本电脑变得容易携带,PC则不容易携带。他们的父亲电脑类又接着说道:你们再仔细观察观察我。过了一会儿笔记本电脑类兴奋的说:爸爸,你只是具有携带这个功能,但并没有指明携带是否方便。他们的父亲说:正因为我无法确定携带这个动作究竟是方便还是不方便,所以特地加了个abstract修饰,也正因为如此,我本身又不得不给我自己加个abstract紧箍咒,这也是我与普通父类的区别,对了,再告诉你们一个消息,其实你们还有其他的兄弟。说完他们的父亲就走了,他们不得不继续游荡下去。

只从上次这两兄弟的父亲告诉他们还有其他的兄弟之后,他们就一直捣腾着怎么联系其他兄弟,终于有一天他们找到了接口-联网接口,联网接口告诉他们:你们必须用implements实现我,才可以联系到你们的其他兄弟,他们很开心,在接口的帮助下很快联系到了他们的另外一个兄弟-量子计算机。

原文链接:https://blog.csdn.net/liuyang_520/article/details/73702141

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP