• 主页
  • Java SE
  • J2ME
  • Web开发
  • Java EE
  • Eclipse

请问java 中什么时候用抽象类,什么时候用接口

m0_56739363 2021-04-20 10:15:33
请问大佬aaaaaaaaa
...全文
663 点赞 收藏 11
写回复
11 条回复
南忆K 05月16日
简单点来说,接口是可以限制实现类必须要实现指定的方法,而使用抽象类可以在此基础上附带一些通用功能的实现方法 比如 class boy class girl 可以都实现animal接口,然后实现具体的eat 、sleep、 run等方法,但是这些方法对于boy 和girl 的实现结果是一致的,也就是相同的代码需要写两遍,那么我们就可以先写一个抽象类Person来实现这些方法,然后boy和girl继承抽象类Person再实现各自独有的方法
回复 点赞
得一以生 05月08日
打个简单的比方,接口A定义了before(),after(),check(),doHandle()四个方法; 抽象类B实现了接口A,实现了公共的check()和doHandle()方法,doHandle()方法中先调用this.check()方法,再调用this.before()和this.after()方法; 实现类C和D,继承了抽象类B,只需要实现before(),after()方法,不同的实现类实现自己的before(),after()方法即可,check()和doHandle()调用交给父类B,父类B会调用C或D的before()和after(),实现具体业务。 ------------------------------------------------------------ 使用的时候所有人的姿势都一样,C和D加上@Component("c或d") @Resource("c") A c; @Resource("d") A d; 这样编写C和D的人就可以专注于自己的业务代码实现,使用的时候也很方便
回复 点赞
一般的俗 05月08日
引用 7 楼 a975719898 的回复:
对多个实例共同行为的提取使用抽象,对其他实例函数规范的声明使用接口. 个人认为具体细节在于接口无法声明静态成员,而抽象则可以正常声明. 可以参考AQS的模板实现
麻烦不要误导人,接口怎么不能声明静态成员?接口在jdk1.8之后可以定义默认方法和静态方法
回复 点赞
m0_56739363 05月01日
谢谢大佬指点
回复 点赞
a975719898 04月29日
对多个实例共同行为的提取使用抽象,对其他实例函数规范的声明使用接口. 个人认为具体细节在于接口无法声明静态成员,而抽象则可以正常声明. 可以参考AQS的模板实现
回复 点赞
=PNZ=BeijingL 04月28日
大多数情况下都建议使用接口儿不使用继承 , 因为继承扩展性的限制子类只能有1个父类, 但接口实现多个接口,因此很多文章和书里都建议的一个设计规则, 多用接口少用继承
回复 点赞
James灬Gosling 04月25日
引用 1 楼 码卖批 的回复:
首先接口的完全抽象的,抽象类的半抽象的,也就是接口的实现类必须实现接口的所有,而抽象类的子类不一定,因为抽象类可以写非抽象方法。另外抽象方法没有方法体,也就是没有具体的行为。
那么,可以想象,不需要具体行为且需要子类去完成具体行为的一类方法,可以用接口。
如果有统一需要完成的行为的方法一般用抽象类。
比如吃喝拉撒这类行为大概我们生物都有,但可能不同种的生物对于这类行为的方式不太一样,所以我们可以将这类行为写在接口供各种生物去实现。
如吃饭,吃面条这两种行为,可能被我们认知为南方人吃饭,北方人吃面条这种惯性思维,那么我们就可以将它们写在抽象类供南方人或北方人去继承。
(个人见解,只供借鉴)


吃饭吃面条这两种行为,都可以抽象为吃,直接写个接口,定义个吃的方法,具体怎么吃,让实现这个接口的实现类自己去重写不就可以了吗 为啥非要用抽象类呢
回复 点赞
heyingss 04月25日
引用 1 楼 码卖批 的回复:
首先接口的完全抽象的,抽象类的半抽象的,也就是接口的实现类必须实现接口的所有,而抽象类的子类不一定,因为抽象类可以写非抽象方法。另外抽象方法没有方法体,也就是没有具体的行为。 那么,可以想象,不需要具体行为且需要子类去完成具体行为的一类方法,可以用接口。 如果有统一需要完成的行为的方法一般用抽象类。 比如吃喝拉撒这类行为大概我们生物都有,但可能不同种的生物对于这类行为的方式不太一样,所以我们可以将这类行为写在接口供各种生物去实现。 如吃饭,吃面条这两种行为,可能被我们认知为南方人吃饭,北方人吃面条这种惯性思维,那么我们就可以将它们写在抽象类供南方人或北方人去继承。 (个人见解,只供借鉴)
解释得太具体详尽了!
回复 点赞
Risve 04月25日
首先接口的完全抽象的,抽象类的半抽象的,也就是接口的实现类必须实现接口的所有,而抽象类的子类不一定,因为抽象类可以写非抽象方法。另外抽象方法没有方法体,也就是没有具体的行为。 那么,可以想象,不需要具体行为且需要子类去完成具体行为的一类方法,可以用接口。 如果有统一需要完成的行为的方法一般用抽象类。 比如吃喝拉撒这类行为大概我们生物都有,但可能不同种的生物对于这类行为的方式不太一样,所以我们可以将这类行为写在接口供各种生物去实现。 如吃饭,吃面条这两种行为,可能被我们认知为南方人吃饭,北方人吃面条这种惯性思维,那么我们就可以将它们写在抽象类供南方人或北方人去继承。 (个人见解,只供借鉴)
回复 点赞
Risve 04月25日
引用 3 楼 James灬Gosling 的回复:
[quote=引用 1 楼 码卖批 的回复:]首先接口的完全抽象的,抽象类的半抽象的,也就是接口的实现类必须实现接口的所有,而抽象类的子类不一定,因为抽象类可以写非抽象方法。另外抽象方法没有方法体,也就是没有具体的行为。 那么,可以想象,不需要具体行为且需要子类去完成具体行为的一类方法,可以用接口。 如果有统一需要完成的行为的方法一般用抽象类。 比如吃喝拉撒这类行为大概我们生物都有,但可能不同种的生物对于这类行为的方式不太一样,所以我们可以将这类行为写在接口供各种生物去实现。 如吃饭,吃面条这两种行为,可能被我们认知为南方人吃饭,北方人吃面条这种惯性思维,那么我们就可以将它们写在抽象类供南方人或北方人去继承。 (个人见解,只供借鉴)
吃饭吃面条这两种行为,都可以抽象为吃,直接写个接口,定义个吃的方法,具体怎么吃,让实现这个接口的实现类自己去重写不就可以了吗 为啥非要用抽象类呢[/quote] 也没有说一定,只是可以,抽象类就像下面说的为了共同点减少代码,或就像你说的,实际上在自己开发中也是很少用到抽象类
回复 点赞
qq_39936465 04月25日
引用 楼主 m0_56739363 的回复:
请问大佬aaaaaaaaa
其实抽象类我们完全可以用接口替代,但是如果我们把所有子类共通的部分写入抽象类中,在分别实现的时候,可以不用重写共通部分,这样话代码可以少写一点,抽象类只是为了能少写代码,让程序更简洁点。
回复 点赞
发动态
发帖子
Java
创建于2007-09-28

1.8w+

社区成员

8.1w+

社区内容

Java相关技术讨论
社区公告
暂无公告