一、抽象类介绍

  

下面通过一下的小程序深入理解抽象类

  因此在类Animal里面只需要定义这个enjoy()方法就可以了,使用abstract关键字把enjoy()方法定义成一个抽象方法,定义如下:public abstract void enjoy();

  从某种意义上来说,抽象方法就是被用来重写的,所以在父类声明的抽象方法一定要在子类里面重写。如果真的不想在子类里面重写这个方法,那么可以再在子类里面把这个方法再定义为抽象方法,因为子类觉得我去实现也不合适,应该让继承我的子类去实现比较合适,因此也可以在继承这个子类的下一个子类里面重写在父类里面声明的抽象方法,这是可以的。

  这里有一个规则:既然父类里面的方法是抽象的,那么对于整个类来说,它就有一个没有实现的方法,这个方法不知道怎么去实现,那么这个类是就是残缺不全的,因此这个类应该被定义为一个抽象类。所以前面这样声明的声明的class Animal应该要在class的前面加上abstract,即声明成这样:abstract class Animal,这样Animal类就成了一个抽象类了。Animal类的最终定义代码如下:

  1. 1 /**
  2. 2 * 父类Animal
  3. 3 * 在class的前面加上abstract,即声明成这样:abstract class Animal
  4. 4 * 这样Animal类就成了一个抽象类了
  5. 5 */
  6. 6 abstract class Animal {
  7. 7
  8. 8 public String name;
  9. 9
  10. 10 public Animal(String name) {
  11. 11 this.name = name;
  12. 12 }
  13. 13
  14. 14 /**
  15. 15 * 抽象方法
  16. 16 * 这里只有方法的定义,没有方法的实现。
  17. 17 */
  18. 18 public abstract void enjoy();
  19. 19
  20. 20 }

  Java语言规定,当一个类里面有抽象方法的时候,这个类必须被声明为抽象类。

  子类继承父类时,如果这个父类里面有抽象方法,并且子类觉得可以去实现父类的所有抽象方法,那么子类必须去实现父类的所有抽象方法,如:

  1. 1 /**
  2. 2 * 子类Dog继承抽象类Animal,并且实现了抽象方法enjoy
  3. 3 * @author gacl
  4. 4 *
  5. 5 */
  6. 6 class Dog extends Animal {
  7. 7 /**
  8. 8 * Dog类添加自己特有的属性
  9. 9 */
  10. 10 public String furColor;
  11. 11
  12. 12 public Dog(String n, String c) {
  13. 13 super(n);//调用父类Animal的构造方法
  14. 14 this.furColor = c;
  15. 15 }
  16. 16
  17. 17 @Override
  18. 18 public void enjoy() {
  19. 19 System.out.println("狗叫....");
  20. 20 }
  21. 21
  22. 22 }

  这个父类里面的抽象方法,子类如果觉得实现不了,那么把就子类也声明成一个抽象类,如:

  1. 1 /**
  2. 2 * 这里的子类Cat从抽象类Animal继承下来,自然也继承了Animal类里面声明的抽象方法enjoy(),
  3. 3 * 但子类Cat觉得自己去实现这个enjoy()方法也不合适,因此它把它自己也声明成一个抽象的类,
  4. 4 * 那么,谁去实现这个抽象的enjoy方法,谁继承了子类,那谁就去实现这个抽象方法enjoy()。
  5. 5 * @author gacl
  6. 6 *
  7. 7 */
  8. 8 abstract class Cat extends Animal {
  9. 9
  10. 10 /**
  11. 11 * Cat添加自己独有的属性
  12. 12 */
  13. 13 public String eyeColor;
  14. 14
  15. 15 public Cat(String n, String c) {
  16. 16 super(n);//调用父类Animal的构造方法
  17. 17 this.eyeColor = c;
  18. 18 }
  19. 19 }

  这里的子类Cat从抽象类Animal继承下来,自然也继承了Animal类里面声明的抽象方法enjoy(),但子类Cat觉得自己去实现这个enjoy()方法也不合适,因此它把它自己也声明成一个抽象的类,那么,谁去实现这个抽象的enjoy方法,谁继承了子类,那谁就去实现这个抽象方法enjoy()。如:

  1. 1 /**
  2. 2 * 子类BlueCat继承抽象类Cat,并且实现了从父类Cat继承下来的抽象方法enjoy
  3. 3 * @author gacl
  4. 4 *
  5. 5 */
  6. 6 class BlueCat extends Cat {
  7. 7
  8. 8 public BlueCat(String n, String c) {
  9. 9 super(n, c);
  10. 10 }
  11. 11
  12. 12 /**
  13. 13 * 实现了抽象方法enjoy
  14. 14 */
  15. 15 @Override
  16. 16 public void enjoy() {
  17. 17 System.out.println("蓝猫叫...");
  18. 18 }
  19. 19
  20. 20 }

完整的测试代码如下:

  1. 1 package javastudy.summary;
  2. 2
  3. 3 /**
  4. 4 * 父类Animal
  5. 5 * 在class的前面加上abstract,即声明成这样:abstract class Animal
  6. 6 * 这样Animal类就成了一个抽象类了
  7. 7 */
  8. 8 abstract class Animal {
  9. 9
  10. 10 public String name;
  11. 11
  12. 12 public Animal(String name) {
  13. 13 this.name = name;
  14. 14 }
  15. 15
  16. 16 /**
  17. 17 * 抽象方法
  18. 18 * 这里只有方法的定义,没有方法的实现。
  19. 19 */
  20. 20 public abstract void enjoy();
  21. 21
  22. 22 }
  23. 23
  24. 24 /**
  25. 25 * 这里的子类Cat从抽象类Animal继承下来,自然也继承了Animal类里面声明的抽象方法enjoy(),
  26. 26 * 但子类Cat觉得自己去实现这个enjoy()方法也不合适,因此它把它自己也声明成一个抽象的类,
  27. 27 * 那么,谁去实现这个抽象的enjoy方法,谁继承了子类,那谁就去实现这个抽象方法enjoy()。
  28. 28 * @author gacl
  29. 29 *
  30. 30 */
  31. 31 abstract class Cat extends Animal {
  32. 32
  33. 33 /**
  34. 34 * Cat添加自己独有的属性
  35. 35 */
  36. 36 public String eyeColor;
  37. 37
  38. 38 public Cat(String n, String c) {
  39. 39 super(n);//调用父类Animal的构造方法
  40. 40 this.eyeColor = c;
  41. 41 }
  42. 42 }
  43. 43
  44. 44 /**
  45. 45 * 子类BlueCat继承抽象类Cat,并且实现了从父类Cat继承下来的抽象方法enjoy
  46. 46 * @author gacl
  47. 47 *
  48. 48 */
  49. 49 class BlueCat extends Cat {
  50. 50
  51. 51 public BlueCat(String n, String c) {
  52. 52 super(n, c);
  53. 53 }
  54. 54
  55. 55 /**
  56. 56 * 实现了抽象方法enjoy
  57. 57 */
  58. 58 @Override
  59. 59 public void enjoy() {
  60. 60 System.out.println("蓝猫叫...");
  61. 61 }
  62. 62
  63. 63 }
  64. 64
  65. 65 /**
  66. 66 * 子类Dog继承抽象类Animal,并且实现了抽象方法enjoy
  67. 67 * @author gacl
  68. 68 *
  69. 69 */
  70. 70 class Dog extends Animal {
  71. 71 /**
  72. 72 * Dog类添加自己特有的属性
  73. 73 */
  74. 74 public String furColor;
  75. 75
  76. 76 public Dog(String n, String c) {
  77. 77 super(n);//调用父类Animal的构造方法
  78. 78 this.furColor = c;
  79. 79 }
  80. 80
  81. 81 @Override
  82. 82 public void enjoy() {
  83. 83 System.out.println("狗叫....");
  84. 84 }
  85. 85
  86. 86 }
  87. 87
  88. 88 public class TestAbstract {
  89. 89
  90. 90 /**
  91. 91 * @param args
  92. 92 */
  93. 93 public static void main(String[] args) {
  94. 94
  95. 95 /**
  96. 96 * 把Cat类声明成一个抽象类以后,就不能再对Cat类进行实例化了,
  97. 97 * 因为抽象类是残缺不全的,缺胳膊少腿的,因此抽象类不能被实例化。
  98. 98 */
  99. 99 //Cat c = new Cat("Catname","blue");
  100. 100 Dog d = new Dog("dogname","black");
  101. 101 d.enjoy();//调用自己实现了的enjoy方法
  102. 102
  103. 103 BlueCat c = new BlueCat("BlueCatname","blue");
  104. 104 c.enjoy();//调用自己实现了的enjoy方法
  105. 105 }
  106. 106 }

Java基础学习总结(3)——抽象类的更多相关文章

  1. Java基础学习笔记(三) - 抽象类和接口

    一.抽象类 没有方法主体的方法称为抽象方法,包含抽象方法的类就是抽象类. Java中使用 abstract 关键字修饰方法和类,抽象方法只有一个方法名,没有方法体. public abstract c ...

  2. java基础学习笔记五(抽象类)

    java基础学习总结——抽象类 抽象类介绍

  3. Java基础学习笔记总结

    Java基础学习笔记一 Java介绍 Java基础学习笔记二 Java基础语法之变量.数据类型 Java基础学习笔记三 Java基础语法之流程控制语句.循环 Java基础学习笔记四 Java基础语法之 ...

  4. 转载-java基础学习汇总

    共2页: 1 2 下一页  Java制作证书的工具keytool用法总结 孤傲苍狼 2014-06-24 11:03 阅读:25751 评论:3     Java基础学习总结——Java对象的序列化和 ...

  5. 尚学堂JAVA基础学习笔记

    目录 尚学堂JAVA基础学习笔记 写在前面 第1章 JAVA入门 第2章 数据类型和运算符 第3章 控制语句 第4章 Java面向对象基础 1. 面向对象基础 2. 面向对象的内存分析 3. 构造方法 ...

  6. Java基础学习(2)

    Java基础学习(二) 面向对象 对象:客观存在的事物 面向对象:人具体关注的事物的某些信息 类:是模子,确定对象会拥有的特征(属性)和行为(方法) 对象的属性:对象具有的各种特征 对象的方法:对象能 ...

  7. Java基础学习(4)

    Java基础学习(四) String类 特点:创建后不可再修改,看起来的修改只是创建了新的对象 常用方法 StringBuilder类 目的:解决String类频繁创建对象的问题 常用方法 特点:非线 ...

  8. Java基础学习-- 继承 的简单总结

    代码参考:Java基础学习小记--多态 为什么要引入继承? 还是做一个媒体库,里面可以放CD,可以放DVD.如果把CD和DVD做成两个没有联系的类的话,那么在管理这个媒体库的时候,要单独做一个添加CD ...

  9. Java基础学习中一些词语和语句的使用

    在Java基础学习中,我们刚接触Java会遇到一些词和语句的使用不清的情况,不能很清楚的理解它的运行效果会是怎么样的,如:break,continue在程序中运行效果及跳转位置, 1.先来看看brea ...

  10. 第二十八节:Java基础-进阶继承,抽象类,接口

    前言 Java基础-进阶继承,抽象类,接口 进阶继承 class Stu { int age = 1; } class Stuo extends Stu { int agee = 2; } class ...

随机推荐

  1. linux中一次创建多个目录

    linux中创建目录当然使用命令工具mkdir == (make directory),联想记忆法能让你记得牢固. 如果你要创建几个目录,例如:dir1目录,dir2目录,dir3目录可以这样 mkd ...

  2. Spring Boot 启动的时候遇到 java.lang.ClassNotFoundException: ch.qos.logback.classic.Level

    在刚开始接触spring boot的时候,想创建一个Hello World 的project. 但是创建完之后,Run as 'Spring Boot APP'的时候遇到这个错误. Level类存在于 ...

  3. vue解决跨域问题

    vue解决跨域问题 vue跨域解决方法和小总结 vue项目中,前端与后台进行数据请求或者提交的时候,如果后台没有设置跨域,前端本地调试代码的时候就会报“No 'Access-Control-Allow ...

  4. SpringBoot中打包设置,将配置文件打包在外部

    一.每次用maven的打包工具打包的时候 总是将配置文件一起打包进jar中!配置文件有点小修改就要重新打包很麻烦!!!!为了解决这一麻烦!找 了很多方法,下面的配置已经实现可用 我的项目目录结构如下 ...

  5. RabbitMQ学习总结(5)——发布和订阅实例详解

    一.Publish/Subscribe(发布/订阅)(using the Java Client) 在前面的教程中,我们创建了一个work Queue(工作队列).工作队列背后的假设是每个任务是交付给 ...

  6. Tomcat远程代码执行漏洞(CVE-2017-12615)修复

    一.漏洞介绍 2017年9月19日,Apache Tomcat官方确认并修复了两个高危漏洞,其中就有Tomcat远程代码执行漏洞,当存在漏洞的Tomcat运行在Windwos主机上,且启用了HTTP ...

  7. Android中通过ViewHelper.setTranslationY实现View移动控制(NineOldAndroids开源项目)

    我们知道有不少开源project,能实现非常多不错的效果.前几天,我看了一个效果,刚好项目中也用到了这个jar包. 没事挖一挖 学一学(一说到挖一挖.那么问题来了.挖掘机技术究竟哪家强 ),看看不错的 ...

  8. 中科燕园arcgis外包案例之12---供水供热管线GIS系统

    项目背景 绍兴县是浙江省第一个"数字城管"试点城市,也是全国第一个"数字城管"县级城市.随着经济的飞速发展.城市化步伐的加快,以及城市规模的扩大和现代化程度的不 ...

  9. 37、ifconfig命令

    很多windows很熟悉ipconfig命令行工具.它被用来获取网络接口配置信息并对此进行改动.Linux系统拥有一个类似的工具,也就是ifconfig(interfaces config). 通常须 ...

  10. 服务器共享session的方式

    服务器共享session的方式 简介 1. 基于NFS的Session共享 NFS是Net FileSystem的简称,最早由Sun公司为解决Unix网络主机间的目录共享而研发.这个方案实现最为简单, ...