秒懂抽象类和接口到底是什么垃圾

新闻
这几天给别人讲JavaSE基础,又把面向对象看了一遍,讲的时候发现一个问题,就是当时讲抽象类和接口的时候说接口也是抽象类,是个特殊的抽象类,当时听的时候别人确实能听懂,因为确实没多少东西,但是真正用的时候总会犹豫,到底什么时候该用抽象类什么时候用接口呢?

  前言

这几天给别人讲JavaSE基础,又把面向对象看了一遍,讲的时候发现一个问题,就是当时讲抽象类和接口的时候说接口也是抽象类,是个特殊的抽象类,当时听的时候别人确实能听懂,因为确实没多少东西,但是真正用的时候总会犹豫,到底什么时候该用抽象类什么时候用接口呢?

  如何区分使用抽象类和接口

大家在比较抽象类和接口的区别时,一定要强调抽象类描述的是事物的本质,而接口描述的是事物的功能。比如:保温杯是水杯,所以水杯应该设计为抽象类,保温杯有保温的功能,所以保温应该设计为接口。

可理解为:

class 保温杯 extends 水杯 implements 保温

用实例说话 

  1. package 
  2.  zmldemo 
  3. //水杯抽象类 
  4. public 
  5.   
  6. abstract 
  7.   
  8. class 
  9.   
  10. Cup 
  11.   
  12.       
  13. String 
  14.  name 
  15. //水杯名称 
  16.       
  17. String 
  18.  color 
  19. //水杯颜色 
  20.  
  21.      
  22. public 
  23.   
  24. Cup 
  25. () 
  26.   
  27.      
  28.  
  29.      
  30. public 
  31.   
  32. Cup 
  33. String 
  34.  name 
  35.   
  36. String 
  37.  color 
  38.   
  39.          
  40. this 
  41. name  
  42.  name 
  43.          
  44. this 
  45. color  
  46.  color 
  47.      
  48.      
  49. //水杯使用说明方法 
  50.      
  51. public 
  52.   
  53. abstract 
  54.   
  55. void 
  56.  useCup 
  57. (); 

 

  1. package 
  2.  zmldemo 
  3. //保温接口 
  4. public 
  5.   
  6. interface 
  7.   
  8. BaoWen 
  9.   
  10.      
  11. //保温方法 
  12.      
  13. public 
  14.   
  15. void 
  16.  baoWen 
  17. (); 

 

  1. package 
  2.  zmldemo 
  3. //刷牙杯 
  4. public 
  5.   
  6. class 
  7.   
  8. ShuaYaBei 
  9.   
  10. extends 
  11.   
  12. Cup 
  13.   
  14.      
  15. public 
  16.   
  17. ShuaYaBei 
  18. () 
  19.   
  20.      
  21.  
  22.      
  23. public 
  24.   
  25. ShuaYaBei 
  26. String 
  27.  name 
  28.   
  29. String 
  30.  color 
  31.   
  32.          
  33. super 
  34. name 
  35.  color 
  36. ); 
  37.      
  38.  
  39.      
  40. @Override 
  41.      
  42. public 
  43.   
  44. void 
  45.  useCup 
  46. () 
  47.   
  48.          
  49. System 
  50. out 
  51. println 
  52. "我是" 
  53. this 
  54. color 
  55. "的" 
  56. this 
  57. name 
  58. "," 
  59. "我是用来刷牙的" 
  60. ); 
  61.      

 

  1. package 
  2.  zmldemo 
  3. //保温杯 
  4. public 
  5.   
  6. class 
  7.   
  8. BaoWenBei 
  9.   
  10. extends 
  11.   
  12. Cup 
  13.   
  14. implements 
  15.   
  16. BaoWen 
  17.  
  18.      
  19. public 
  20.   
  21. BaoWenBei 
  22. (){ 
  23.  
  24.      
  25.      
  26. public 
  27.   
  28. BaoWenBei 
  29. String 
  30.  name 
  31. String 
  32.  color 
  33. ){ 
  34.          
  35. super 
  36. name 
  37. color 
  38. ); 
  39.      
  40.  
  41.  
  42.      
  43. @Override 
  44.      
  45. public 
  46.   
  47. void 
  48.  useCup 
  49. () 
  50.   
  51.          
  52. System 
  53. out 
  54. println 
  55. "我是" 
  56. this 
  57. color 
  58. "的" 
  59. this 
  60. name 
  61. "," 
  62. "我是用来喝水的" 
  63. ); 
  64.      
  65.  
  66.      
  67. @Override 
  68.      
  69. public 
  70.   
  71. void 
  72.  baoWen 
  73. () 
  74.   
  75.          
  76. System 
  77. out 
  78. println 
  79. "我能对水杯里的水进行保温" 
  80. ); 
  81.      

 

  1. package 
  2.  zmldemo 
  3.  
  4. public 
  5.   
  6. class 
  7.   
  8. CupTest 
  9.   
  10.      
  11. public 
  12.   
  13. static 
  14.   
  15. void 
  16.  main 
  17. String 
  18. [] 
  19.  args 
  20.   
  21.          
  22. ShuaYaBei 
  23.  shuaYaBei  
  24.   
  25. new 
  26.   
  27. ShuaYaBei 
  28. "刷牙杯" 
  29. "红色" 
  30. ); 
  31.         shuaYaBei 
  32. useCup 
  33. (); 
  34.  
  35.          
  36. BaoWenBei 
  37.  baoWenBei  
  38.   
  39. new 
  40.   
  41. BaoWenBei 
  42. "保温杯" 
  43. "金黄色" 
  44. ); 
  45.         baoWenBei 
  46. useCup 
  47. (); 
  48.         baoWenBei 
  49. baoWen 
  50. (); 
  51.  
  52.  
  53.      

运行结果: 

 

我想看到这,学过抽象类和接口的朋友应该能理解了,那本篇标题“抽象类和接口到底是什么垃圾——秒懂”对应的部分完成了,既然都说到这了,再来点延申。

话题延申

抽象类和接口能实例化对象吗?

这个问题其实也有很多人纠结,我之前专门有过对这个问题在网上进行搜索查询,看了好几篇别人写的博客,结果答案不一,理解各不相同,有的博客里的理解还有错误,容易对别人误导,后来我自己查资料,用自己的理解写了一篇博客《抽象类能实例化吗?——口气很强硬——“不能”(详解)》,结果当然正如其名所示,是不能的,至于为何,里面有详细的解释,大家自行查阅,在这就不做补充了。

 

责任编辑:武晓燕 来源: 泰斗贤若如
相关推荐

2023-11-01 10:26:02

灯塔工厂数字化转型

2009-08-14 15:42:11

什么是.NET接口.NET抽象类

2020-10-19 13:03:16

Java 8接口抽象类

2012-02-29 09:32:01

Java

2021-12-23 07:11:31

开发

2010-03-04 09:40:04

Java接口抽象类

2011-06-28 10:55:20

C#接口抽象类

2009-07-30 18:36:00

C#接口C#抽象类

2011-07-12 15:58:48

java抽象类接口

2009-04-30 15:15:01

Java抽象类接口

2009-08-10 10:04:25

C#抽象类C#接口

2011-04-27 09:30:48

企业架构

2020-09-22 08:22:28

快充

2010-11-01 01:25:36

Windows NT

2020-09-27 06:53:57

MavenCDNwrapper

2020-10-14 06:22:14

UWB技术感知

2012-09-03 09:58:09

2011-07-10 14:07:59

JAVA

2011-12-22 10:48:21

Java

2015-03-23 09:33:43

Java抽象类Java接口Java
点赞
收藏

51CTO技术栈公众号