上一篇(http://blog.csdn.net/qq_32059827/article/details/51334198)对抽象类做了一些描述,这一篇根据两个案例加深一下印象。会觉得抽象类其实不抽象:

案例一:猫狗案例。

  1. /*
  2. 猫狗案例
  3. 具体事物:猫,狗
  4. 共性:姓名,年龄,吃饭
  5.  
  6. 分析:从具体到抽象
  7. 猫:
  8. 成员变量:姓名,年龄
  9. 构造方法:无参,带参
  10. 成员方法:吃饭(猫吃鱼)
  11.  
  12. 狗:
  13. 成员变量:姓名,年龄
  14. 构造方法:无参,带参
  15. 成员方法:吃饭(狗吃肉)
  16.  
  17. 因为有共性的内容,所以就提取了一个父类。动物。
  18. 但是又由于吃饭的内容不一样,所以吃饭的方法是抽象的,
  19. 而方法是抽象的类,类就必须定义为抽象类。
  20.  
  21. 抽象动物类:
  22. 成员变量:姓名,年龄
  23. 构造方法:无参,带参
  24. 成员方法:吃饭();是抽象的
  25.  
  26. 实现:从抽象到具体
  27. 动物类:
  28. 成员变量:姓名,年龄
  29. 构造方法:无参,带参
  30. 成员方法:吃饭();
  31.  
  32. 狗类:
  33. 继承自动物类
  34. 重写吃饭();
  35.  
  36. 猫类:
  37. 继承自动物类
  38. 重写吃饭();
  39. */
  40. //定义抽象的动物类
  41. abstract class Animal {
  42. //姓名
  43. private String name;
  44. //年龄
  45. private int age;
  46.  
  47. public Animal() {}
  48.  
  49. public Animal(String name,int age) {
  50. this.name = name;
  51. this.age = age;
  52. }
  53.  
  54. public String getName() {
  55. return name;
  56. }
  57.  
  58. public void setName(String name) {
  59. this.name = name;
  60. }
  61.  
  62. public int getAge() {
  63. return age;
  64. }
  65.  
  66. public void setAge(int age) {
  67. this.age = age;
  68. }
  69.  
  70. //定义一个抽象方法
  71. public abstract void eat();
  72. }
  73.  
  74. //定义具体的狗类
  75. class Dog extends Animal {
  76. public Dog() {}
  77.  
  78. public Dog(String name,int age) {
  79. super(name,age);//访问父类中的有参构造方法,用super关键字。
  80. }
  81.  
  82. public void eat() {//子类方法重写
  83. System.out.println("狗吃肉");
  84. }
  85. }
  86.  
  87. //定义具体的猫类
  88. class Cat extends Animal {
  89. public Cat() {}
  90.  
  91. public Cat(String name,int age) {
  92. super(name,age);
  93. }
  94.  
  95. public void eat() {//子类方法重写
  96. System.out.println("猫吃鱼");
  97. }
  98. }
  99.  
  100. //测试类
  101. class AbstractTest {
  102. public static void main(String[] args) {
  103. //测试狗类
  104. //具体类用法
  105. //方式1:
  106. Dog d = new Dog();
  107. d.setName("旺财");//继承自父类
  108. d.setAge(3);//继承自父类
  109. System.out.println(d.getName()+"---"+d.getAge());
  110. d.eat();
  111. //方式2:
  112. Dog d2 = new Dog("旺财",3);//super那边
  113. System.out.println(d2.getName()+"---"+d2.getAge());
  114. d2.eat();
  115. System.out.println("---------------------------");
  116.  
  117. //使用多态的方式
  118. Animal a = new Dog();
  119. a.setName("旺财");
  120. a.setAge(3);
  121. System.out.println(a.getName()+"---"+a.getAge());
  122. a.eat();
  123.  
  124. Animal a2 = new Dog("旺财",3);
  125. System.out.println(a2.getName()+"---"+a2.getAge());
  126. a2.eat();
  127. System.out.println("---------------------------");
  128. a = new Dog("露露",12);
  129. System.out.println(a.getName()+"---"+a.getAge());
  130. a.eat();
  131. System.out.println("---------------------------");
  132. //练习:测试猫类
  133. //方式一
  134. Cat c = new Cat();
  135. c.setName("小花");
  136. c.setAge(5);
  137. System.out.println(c.getName()+"---"+c.getAge());
  138. c.eat();
  139. System.out.println("---------------------------");
  140. //方式二
  141. Cat c1 = new Cat("xiaohua",4);
  142. System.out.println(c1.getName()+"---"+c1.getAge());
  143. c1.eat();
  144. System.out.println("---------------------------");
  145. //多态实现
  146. //方式一
  147. Animal a3 = new Cat();
  148. a3.setName("小花");
  149. a3.setAge(5);
  150. System.out.println(a3.getName()+"---"+a3.getAge());
  151. a3.eat();
  152. System.out.println("---------------------------");
  153. //方式二
  154. Animal a4 = new Cat("xiaohua",4);//注意这里书写的方式与老师上面讲解方式的不同,这里相当于给a3(重新分配了地址)(因为new了一下)。但是用了(同一个变量)a3,正确
  155. System.out.println(a4.getName()+"---"+a4.getAge());
  156. a4.eat();
  157. System.out.println("---------------------------");
  158. a3 = new Cat("tom",9);
  159. System.out.println(a3.getAge()+"----"+a3.getName());
  160. a3.eat();
  161. }
  162. }

案例二:公司职员案例:

  1. /*
  2.  
  3. 实现:
  4. 员工类:
  5. 普通员工类:
  6. 经理类:
  7. */
  8. //定义员工类
  9. abstract class Employee {
  10. //姓名、工号以及工资
  11. private String name;
  12. private String id;
  13. private int salary;
  14.  
  15. public Employee() {}
  16.  
  17. public Employee(String name,String id,int salary) {
  18. this.name = name;
  19. this.id = id;
  20. this.salary = salary;
  21. }
  22.  
  23. public String getName() {
  24. return name;
  25. }
  26.  
  27. public void setName(String name) {
  28. this.name = name;
  29. }
  30.  
  31. public String getId() {
  32. return id;
  33. }
  34.  
  35. public void setId(String id) {
  36. this.id = id;
  37. }
  38.  
  39. public int getSalary() {
  40. return salary;
  41. }
  42.  
  43. public void setSalary(int salary) {
  44. this.salary = salary;
  45. }
  46.  
  47. //工作,工作内容不一样,定义一个抽象方法,在子类中必须要有方法重写
  48. public abstract void work();
  49. }
  50.  
  51. //普通员工类
  52. class Programmer extends Employee {
  53. public Programmer(){}
  54.  
  55. public Programmer(String name,String id,int salary) {
  56. super(name,id,salary);
  57. }
  58.  
  59. public void work() {
  60. System.out.println("按照需求写代码");
  61. }
  62. }
  63.  
  64. //经理类
  65. class Manager extends Employee {
  66. //奖金,经理独有的属性
  67. private int bonus; //bonus 奖金
  68.  
  69. public Manager(){}
  70.  
  71. public Manager(String name,String id,int salary,int bonus) {
  72. super(name,id,salary);
  73. this.bonus = bonus;//this代表本类的成员
  74. }
  75.  
  76. public void work() {//父类工作的抽象方法子类要有方法重写
  77. System.out.println("跟客户谈需求");
  78. }
  79.  
  80. public int getBonus() {
  81. return bonus;
  82. }
  83.  
  84. public void setBonus(int bonus) {
  85. this.bonus = bonus;
  86. }
  87. }
  88.  
  89. class AbstractTest4 {
  90. public static void main(String[] args) {
  91. //测试普通员工,利用多态实现
  92. Employee emp = new Programmer();
  93. emp.setName("林青霞");
  94. emp.setId("001");
  95. emp.setSalary(8000);
  96. System.out.println(emp.getName()+"---"+emp.getId()+"---"+emp.getSalary());
  97. emp.work();
  98. System.out.println("-------------");
  99. emp = new Programmer("林青霞","001",8000);//重新分配地址,重新分配内存空间
  100. System.out.println(emp.getName()+"---"+emp.getId()+"---"+emp.getSalary());
  101. emp.work();
  102. System.out.println("-------------");
  103.  
  104. //由于子类有特有的内容,所以不采用多态方式
  105. Manager m = new Manager();
  106. m.setName("小吴");
  107. m.setId("002");
  108. m.setSalary(8000);
  109. m.setBonus(2000);
  110. System.out.println(m.getName()+"---"+m.getId()+"---"+m.getSalary()+"---"+m.getBonus());
  111. m.work();
  112. System.out.println("-------------");
  113.  
  114. //通过构造方法赋值
  115. m = new Manager("刘意","czbk002",8000,2000);
  116. System.out.println(m.getName()+"---"+m.getId()+"---"+m.getSalary()+"---"+m.getMoney());
  117. m.work();
  118. }
  119. }

《java入门第一季》之面向对象(抽象类其实不抽象)的更多相关文章

  1. JAVA入门第一季(mooc-笔记)

    笔记相关信息 /** * @subject <学习与创业>作业1 * @author 信管1142班 201411671210 赖俊杰 * @className <JAVA入门第一季 ...

  2. Java入门第一季——从此投身Java??

    找工作告一段落. 最后的工作呢,和java紧密相关,也是阴差阳错,不过都是软件开发,都好了,不过以后侧重点肯定是在java这边,php有机会还是一直学下去的,那么美的说~ Java开发第一季  一.简 ...

  3. 《java入门第一季》之面向对象(谈谈接口)

    软件中有接口,这里的接口与硬件中的接口还是有很大区别的. 这里介绍接口不考虑JDK8的新特性(JDK8开始接口里面可以有非抽象方法了,介绍JDK8新特性可能要到整个第一季写完吧!) 还是直接进入接口的 ...

  4. Java入门第一季

    慕课网:http://www.imooc.com/learn/85 Java入门知识第一季 1.Java开发环境和IDE的使用: 2.变量和常量 3.常用的运算符 4.流程控制语句 5.数组:使用Ar ...

  5. 《java入门第一季》之Arrays类前传(排序案例以二分查找注意的问题)

    根据排序算法,可以解决一些小案例.举例如下: /* * 把字符串中的字符进行排序. * 举例:"dacgebf" * 结果:"abcdefg" * * 分析: ...

  6. 《java入门第一季》之面向对象(抽象类到底多抽象)

    /* 抽象类的概述: 动物不应该定义为具体的东西,而且动物中的吃,睡等也不应该是具体的. 我们把一个不是具体的功能称为抽象的功能,而一个类中如果有抽象的功能,该类必须被称为是抽象类. 抽象类的特点: ...

  7. 《java入门第一季》之面向对象(包概述)

    由于eclipse等ide的强大功能,使得建包,导包用一些快捷键就能完成.这里对包的概念做稍微的叙述,了解即可: 分包后使得项目更加清晰,提高代码维护性. 包:         A:其实就是文件夹   ...

  8. 《java入门第一季》之面向对象(接口收尾)

    通过案例的形式,结束接口部分. /* 猫狗案例,加入跳高的额外功能 分析:从具体到抽象 猫: 姓名,年龄 吃饭,睡觉 狗: 姓名,年龄 吃饭,睡觉 由于有共性功能,所以,我们抽取出一个父类: 动物: ...

  9. 《java入门第一季》之面向对象多态面试题(多态收尾)

    /* 看程序写结果:先判断有没有问题,如果没有,写出结果 */ class A { public void show() { show2(); } public void show2() { Syst ...

随机推荐

  1. 搜索引擎solr和elasticsearch

    刚开始接触搜索引擎,网上收集了一些资料,在这里整理了一下分享给大家. 一.关于搜索引擎 搜索引擎(Search Engine)是指根据一定的策略.运用特定的计算机程序从互联网上搜集信息,在对信息进行组 ...

  2. Java经典设计模式之七大结构型模式(附实例和详解)

    博主在大三的时候有上过设计模式这一门课,但是当时很多都基本没有听懂,重点是也没有细听,因为觉得没什么卵用,硬是要搞那么复杂干嘛.因此设计模式建议工作半年以上的猿友阅读起来才会理解的比较深刻.当然,你没 ...

  3. Git之(六)标签管理

    发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本.将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来.所以,标签也是版本库的一个快照 ...

  4. iOS-改变UITextField的Placeholder颜色的三种方式

    转自:http://blog.csdn.net/mazy_ma/article/details/51775670 有时,UITextField自带的Placeholder的颜色太浅或者不满足需求,所以 ...

  5. activiti监听器使用

    分享牛原创(尊重原创 转载对的时候第一行请注明,转载出处来自分享牛http://blog.csdn.net/qq_30739519) activiti使用的时候,通常需要跟业务紧密的结合在一起,有些业 ...

  6. Shell脚本生成网页版相册浏览器

    今天学到了一招,那就是使用脚本制作一款网页版相册浏览器.先上图吧. 必备基础 操作系统: 以linux为内核的操作系统都行 编程语言:Shell(bash)脚本,相关基础知识即可 下载工具:wget ...

  7. xlsx批量转为utf8的csv

    xlsx批量转为utf8的csv(金庆的专栏)策划的配置表为 xlsx 表格,可以有注释,公式.服务器和客户端使用的配置文件需要转成 csv 文件.使用 WPS 另存无法批量转换,并且结果不是utf8 ...

  8. Dynamics CRM2013 在Visual Studio中开启脚本的Xrm.Page智能提示

    前面篇博文http://blog.csdn.net/vic0228/article/details/49663751提到了通过引用XrmPage-vsdoc.js文件来启用Xrm.Page的智能提示, ...

  9. 闪屏页面开发遇到的问题you need to use a theme.appcompat theme (or descendant)

    开始做一个新闻客户端的应用,在做到闪屏页面时之前发布应用的时候总是报错,原因是我在splash.java中把Activty写成ActionBarActivity,导包,然后就可以了.以前也遇到过这种情 ...

  10. C++中友元详解

    问题的提出 我们已知道类具备封装和信息隐 藏的特性.只有类的成员函数才能访问类的私有成员,程式中的其他函数是无法访问私有成员的.非成员函数能够访问类中的公有成员,但是假如将数据成员都定义 为公有的,这 ...