当前位置:   article > 正文

头歌—— 封装、继承和多态的综合练习

封装、继承和多态的综合练习

 第1关:封装、继承和多态进阶(一)

  1. package case1;
  2. import java.util.Scanner;
  3. public class Task1 {
  4. public static void main(String[] args) {
  5. Scanner sc = new Scanner(System.in);
  6. String dogName = sc.next();
  7. String dogSex = sc.next();
  8. String dogColor = sc.next();
  9. String catName = sc.next();
  10. String catSex = sc.next();
  11. double catWeight = sc.nextDouble();
  12. // 通过有参构造函数实例化Dog类对象dog
  13. /********* begin *********/
  14. Dog dog=new Dog(dogName,dogSex,dogColor);
  15. dog.talk();
  16. dog.eat();
  17. /********* end *********/
  18. // 通过有参构造函数实例化Cat类对象cat
  19. // cat调用talk()方法
  20. // cat调用eat()方法
  21. /********* begin *********/
  22. Cat cat=new Cat(catName,catSex,catWeight);
  23. cat.talk();
  24. cat.eat();
  25. /********* end *********/
  26. }
  27. }
  28. // 抽象类Pet 封装属性name和sex
  29. // 构造函数初始化name和sex
  30. // 声明抽象方法talk()
  31. // 声明抽象方法eat()
  32. abstract class Pet {
  33. /********* begin *********/
  34. public abstract void talk();
  35. public abstract void eat();
  36. private String name;
  37. private String sex;
  38. public String getname(){
  39. return name;
  40. }
  41. public void setname(String name){
  42. this.name=name;
  43. }
  44. public String getsex(){
  45. return sex;
  46. }
  47. public void setsex(String sex){
  48. this.sex=sex;
  49. }
  50. public Pet(String name,String sex){
  51. this.name=name;
  52. this.sex=sex;
  53. }
  54. /********* end *********/
  55. }
  56. // Dog类继承自Pet类 封装属性color
  57. // 构造函数初始化name、sex和color
  58. // 实现自己的talk()方法和eat()方法
  59. // talk()输出'名称:name,性别:sex,颜色:color,汪汪叫'
  60. // eat()输出'name吃骨头'
  61. class Dog extends Pet {
  62. /********* begin *********/
  63. private String color;
  64. public String getcolor(){
  65. return color;
  66. }
  67. public void setcolor(String color){
  68. this.color=color;
  69. }
  70. public Dog(String name,String sex,String color){
  71. super(name,sex);
  72. sex=super.getname();
  73. name=super.getname();
  74. this.color=color;
  75. }
  76. public void talk(){
  77. System.out.println("名称:"+super.getname()+",性别:"+super.getsex()+",颜色:"+color+",汪汪叫");
  78. }
  79. public void eat(){
  80. System.out.println(super.getname()+"吃骨头!");
  81. }
  82. /********* end *********/
  83. }
  84. // Cat类继承自Pet类 封装属性weight
  85. // 构造函数初始化name、sex和weight
  86. // 实现自己的talk()方法和eat()方法
  87. // talk()输出'名称:name,性别:sex,体重:weight kg,喵喵叫'
  88. // eat()输出'name吃鱼'
  89. class Cat extends Pet {
  90. /********* begin *********/
  91. private double weight;
  92. public double getweight(){
  93. return weight;
  94. }
  95. public void setweight(double weight){
  96. this.weight=weight;
  97. }
  98. public Cat(String name,String sex,double weight){
  99. super(name,sex);
  100. sex=super.getname();
  101. name=super.getname();
  102. this.weight=weight;
  103. }
  104. public void talk(){
  105. System.out.println("名称:"+super.getname()+",性别:"+super.getsex()+",体重:"+weight+"kg,喵喵叫");
  106. }
  107. public void eat(){
  108. System.out.println(super.getname()+"吃鱼!");
  109. }
  110. /********* end *********/
  111. }

第2关:封装、继承和多态进阶(二) 

  1. package case2;
  2. import java.util.Scanner;
  3. public class Task2 {
  4. public static void main(String[] args) {
  5. Scanner sc = new Scanner(System.in);
  6. String cName = sc.next();
  7. String cSex = sc.next();
  8. int cAge = sc.nextInt();
  9. String eName = sc.next();
  10. String eSex = sc.next();
  11. int eAge = sc.nextInt();
  12. // 创建测试类对象test
  13. // 创建Person类对象person1,引用指向中国人,通过有参构造函数实例化中国人类对象
  14. // 通过showEat()方法调用Chinese的eat()方法
  15. // 创建Person类对象person2,引用指向英国人,通过有参构造函数实例化英国人类对象
  16. // 通过showEat()方法调用English的eat()方法
  17. /********* begin *********/
  18. Person person1=new Chinese(cName,cSex,cAge);
  19. showEat(person1);
  20. Person person2=new English(eName,eSex,eAge);
  21. showEat(person2);
  22. /********* end *********/
  23. // 强制类型转换(向下转型) 调用Chinese类特有的方法shadowBoxing()
  24. // 强制类型转换(向下转型) 调用English类特有的方法horseRiding()
  25. /********* begin *********/
  26. Chinese chinese=(Chinese) person1;
  27. chinese.shadowBoxing();
  28. English english=(English) person2;
  29. english.horseRiding();
  30. /********* end *********/
  31. }
  32. // 定义showEat方法,使用父类作为方法的形参,实现多态,传入的是哪个具体对象就调用哪个对象的eat()方法
  33. /********* begin *********/
  34. public static void showEat(Person person){
  35. person.eat();
  36. }
  37. /********* end *********/
  38. }
  39. // 抽象类Person 封装属性name、sex和age
  40. // 构造函数初始化name、sex和age
  41. // 声明抽象方法eat()
  42. abstract class Person {
  43. /********* begin *********/
  44. private String name;
  45. private String sex;
  46. private int age;
  47. public String getname(){
  48. return name;
  49. }
  50. public void setname(String name){
  51. this.name=name;
  52. }
  53. public String getsex(){
  54. return sex;
  55. }
  56. public void setsex(String sex){
  57. this.sex=sex;
  58. }
  59. public int getage(){
  60. return age;
  61. }
  62. public void setage(int age){
  63. this.age=age;
  64. }
  65. public Person (String name,String sex,int age){
  66. this.name=name;
  67. this.sex=sex;
  68. this.age=age;
  69. }
  70. public abstract void eat();
  71. /********* end *********/
  72. }
  73. // Chinese类继承自Person类
  74. // 构造函数初始化name、sex和age
  75. // 重写父类方法eat() 输出'姓名:name,性别:sex,年龄:age,我是中国人,我喜欢吃饭!'
  76. // 定义子类特有方法shadowBoxing(),当父类引用指向子类对象时无法调用该方法 输出'name在练习太极拳!'
  77. class Chinese extends Person {
  78. /********* begin *********/
  79. public Chinese(String name,String sex,int age){
  80. super(name,sex,age);
  81. sex=super.getname();
  82. name=super.getname();
  83. age=super.getage();
  84. }
  85. public void eat(){
  86. System.out.println("姓名:"+super.getname()+",性别:"+super.getsex()+",年龄:"+super.getage()+",我是中国人,我喜欢吃饭!");
  87. }
  88. public void shadowBoxing(){
  89. System.out.println(super.getname()+"在练习太极拳!");
  90. }
  91. /********* end *********/
  92. }
  93. // English类继承自Person类
  94. // 构造函数初始化name、sex和age
  95. // 重写父类方法eat() 输出'姓名:name,性别:sex,年龄:age,我是英国人,我喜欢吃三明治!'
  96. // 定义子类特有方法horseRiding(),当父类引用指向子类对象时无法调用该方法 输出'name在练习骑马!'
  97. class English extends Person {
  98. /********* begin *********/
  99. public English(String name,String sex,int age){
  100. super(name,sex,age);
  101. sex=super.getname();
  102. name=super.getname();
  103. age=super.getage();
  104. }
  105. public void eat(){
  106. System.out.println("姓名:"+super.getname()+",性别:"+super.getsex()+",年龄:"+super.getage()+",我是英国人,我喜欢吃三明治!");
  107. }
  108. public void horseRiding(){
  109. System.out.println(super.getname()+"在练习骑马!");
  110. }
  111. /********* end *********/
  112. }

第3关:封装、继承和多态进阶(三)

  1. package case3;
  2. import java.util.Scanner;
  3. public class Task3 {
  4. public static void main(String[] args) {
  5. @SuppressWarnings("resource")
  6. Scanner sc = new Scanner(System.in);
  7. String pppName = sc.next();
  8. int pppAge = sc.nextInt();
  9. String bpName = sc.next();
  10. int bpAge = sc.nextInt();
  11. String ppcName = sc.next();
  12. int ppcAge = sc.nextInt();
  13. String bcName = sc.next();
  14. int bcAge = sc.nextInt();
  15. // 测试运动员(乒乓球运动员和篮球运动员)
  16. // 乒乓球运动员
  17. // 通过带参构造函数实例化PingPangPlayer对象ppp
  18. // 输出'name---age'
  19. // 分别调用sleep()、eat()、study()、speak()方法
  20. /********* begin *********/
  21. PingPangPlayer ppp=new PingPangPlayer(pppName,pppAge);
  22. System.out.println(pppName+"---"+pppAge);
  23. ppp.sleep();
  24. ppp.eat();
  25. ppp.study();
  26. ppp.speak();
  27. /********* end *********/
  28. System.out.println("----------------");
  29. // 篮球运动员
  30. // 通过带参构造函数实例化BasketballPlayer对象bp
  31. // 输出'name---age'
  32. // 分别调用sleep()、eat()、study()方法
  33. /********* begin *********/
  34. BasketballPlayer bp=new BasketballPlayer(bpName,bpAge);
  35. System.out.println(bpName+"---"+bpAge);
  36. bp.sleep();
  37. bp.eat();
  38. bp.study();
  39. /********* end *********/
  40. System.out.println("----------------");
  41. // 测试教练(乒乓球教练和篮球教练)
  42. // 乒乓球教练
  43. // 通过带参构造函数实例化PingPangCoach对象ppc
  44. // 输出'name---age'
  45. // 分别调用sleep()、eat()、teach()、speak()方法
  46. /********* begin *********/
  47. PingPangCoach ppc=new PingPangCoach(ppcName,ppcAge);
  48. System.out.println(ppcName+"---"+ppcAge);
  49. ppc.sleep();
  50. ppc.eat();
  51. ppc.teach();
  52. ppc.speak();
  53. /********* end *********/
  54. System.out.println("----------------");
  55. // 篮球教练
  56. // 通过带参构造函数实例化BasketballCoach对象bc
  57. // 输出'name---age'
  58. // 分别调用sleep()、eat()、teach()方法
  59. /********* begin *********/
  60. BasketballCoach bc=new BasketballCoach(bcName,bcAge);
  61. System.out.println(bcName+"---"+bcAge);
  62. bc.sleep();
  63. bc.eat();
  64. bc.teach();
  65. /********* end *********/
  66. System.out.println("----------------");
  67. }
  68. }
  69. // 说英语接口 声明抽象方法speak()
  70. interface SpeakEnglish {
  71. /********* begin *********/
  72. void speak();
  73. /********* end *********/
  74. }
  75. // 定义人的抽象类Person 封装name和age
  76. // 无参构造函数
  77. // 有参构造函数初始化name和age
  78. // 定义具体方法sleep() 输出'人都是要睡觉的'
  79. // 抽象方法eat()(吃的不一样)
  80. abstract class Person {
  81. /********* begin *********/
  82. private String name;
  83. private int age;
  84. public String getname(){
  85. return name;
  86. }
  87. public void setname(String name){
  88. this.name=name;
  89. }
  90. public int getage(){
  91. return age;
  92. }
  93. public void setage(int age){
  94. this.age=age;
  95. }
  96. public Person(String name,int age){
  97. this.name=name;
  98. this.age=age;
  99. }
  100. public void sleep(){
  101. System.out.println("人都是要睡觉的");
  102. }
  103. abstract void eat();
  104. /********* end *********/
  105. }
  106. // 定义运动员Player(抽象类)继承自Person类
  107. // 无参构造函数
  108. // 有参构造函数初始化name和age
  109. // 运动员学习内容不一样,抽取为抽象 定义抽象方法study()
  110. abstract class Player extends Person {
  111. /********* begin *********/
  112. public Player(String name,int age){
  113. super(name,age);
  114. name=super.getname();
  115. age=super.getage();
  116. }
  117. abstract void study();
  118. /********* end *********/
  119. }
  120. // 定义教练Coach(抽象类)继承自Person类
  121. // 无参构造函数
  122. // 有参构造函数初始化name和age
  123. // 教练教的不一样 定义抽象方法teach()
  124. abstract class Coach extends Person {
  125. /********* begin *********/
  126. public Coach(String name,int age){
  127. super(name,age);
  128. name=super.getname();
  129. age=super.getage();
  130. }
  131. abstract void teach();
  132. /********* end *********/
  133. }
  134. // 定义乒乓球运动员具体类PingPangPlayer 继承自Player类并实现SpeakEnglish类(兵乓球运动员需要说英语)
  135. // 无参构造函数
  136. // 有参构造函数初始化name和age
  137. // 实现自己的eat()方法 输出'乒乓球运动员吃大白菜,喝小米粥'
  138. // 实现自己的study()方法 输出'乒乓球运动员学习如何发球和接球'
  139. // 实现自己的speak()方法 输出'乒乓球运动员说英语'
  140. class PingPangPlayer extends Player implements SpeakEnglish {
  141. /********* begin *********/
  142. public PingPangPlayer(String name,int age){
  143. super(name,age);
  144. name=super.getname();
  145. age=super.getage();
  146. }
  147. public void eat(){
  148. System.out.println("乒乓球运动员吃大白菜,喝小米粥");
  149. }
  150. public void study(){
  151. System.out.println("乒乓球运动员学习如何发球和接球");
  152. }
  153. public void speak(){
  154. System.out.println("乒乓球运动员说英语");
  155. }
  156. /********* end *********/
  157. }
  158. // 定义篮球运动员具体类BasketballPlayer 继承自Player类 不需要继承接口,因为他不需要说英语
  159. // 无参构造函数
  160. // 有参构造函数初始化name和age
  161. // 实现自己的eat()方法 输出'篮球运动员吃牛肉,喝牛奶'
  162. // 实现自己的study()方法 输出'篮球运动员学习如何运球和投篮'
  163. class BasketballPlayer extends Player {
  164. /********* begin *********/
  165. public BasketballPlayer(String name,int age){
  166. super(name,age);
  167. name=super.getname();
  168. age=super.getage();
  169. }
  170. public void eat(){
  171. System.out.println("篮球运动员吃牛肉,喝牛奶");
  172. }
  173. public void study(){
  174. System.out.println("篮球运动员学习如何运球和投篮");
  175. }
  176. /********* end *********/
  177. }
  178. // 定义乒乓球教练具体类 PingPangCoach 继承自Coach类并实现SpeakEnglish类(兵乓球教练需要说英语)
  179. // 无参构造函数
  180. // 有参构造函数初始化name和age
  181. // 实现自己的eat()方法 输出'乒乓球教练吃小白菜,喝大米粥'
  182. // 实现自己的teach()方法 输出'乒乓球教练教如何发球和接球'
  183. // 实现自己的speak()方法 输出'乒乓球教练说英语'
  184. class PingPangCoach extends Coach implements SpeakEnglish {
  185. /********* begin *********/
  186. public PingPangCoach(String name,int age){
  187. super(name,age);
  188. name=super.getname();
  189. age=super.getage();
  190. }
  191. public void eat(){
  192. System.out.println("乒乓球教练吃小白菜,喝大米粥");
  193. }
  194. public void teach(){
  195. System.out.println("乒乓球教练教如何发球和接球");
  196. }
  197. public void speak(){
  198. System.out.println("乒乓球教练说英语");
  199. }
  200. /********* end *********/
  201. }
  202. // 定义篮球教练具体类BasketballCoach 继承自Coach类 不需要继承接口,因为他不需要说英语
  203. // 无参构造函数
  204. // 有参构造函数初始化name和age
  205. // 实现自己的eat()方法 输出'篮球教练吃羊肉,喝羊奶'
  206. // 实现自己的teach()方法 输出'篮球教练教如何运球和投篮'
  207. class BasketballCoach extends Coach {
  208. /********* begin *********/
  209. public BasketballCoach(String name,int age){
  210. super(name,age);
  211. name=super.getname();
  212. age=super.getage();
  213. }
  214. public void eat(){
  215. System.out.println("篮球教练吃羊肉,喝羊奶");
  216. }
  217. public void teach(){
  218. System.out.println("篮球教练教如何运球和投篮");
  219. }
  220. /********* end *********/
  221. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/576478
推荐阅读
相关标签
  

闽ICP备14008679号