当前位置:   article > 正文

Java面向对象 - 封装、继承和多态的综合练习(答案+知识点总结)第1关:封装、继承和多态进阶(一)+ 第2关:封装、继承和多态进阶(二)

java面向对象 - 封装、继承和多态的综合练习

目录

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

报错总结 & 注意事项:

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

 源码:

报错总结 & 注意事项:

思维导图免费制作网站: 功能强大

学习方法:头歌中左侧知识点的解释还有右侧代码的提示模块非常清晰,我们可以:

①观察代码整体模块②尝试写代码③不清楚知识点,再将左侧解析放在实例当中去看 [那些注释都给我们写好了,对应注释去敲代码]

如果我们实在啥也不会,参考他人代码,那么也不要全部照抄

【例如】抄完有参构造实例化对象Dog后,自己去敲Cat

第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. /********* begin *********/
  13. Dog dog = new Dog(dogName,dogSex,dogColor); // 通过有参构造函数实例化Dog类对象dog
  14. dog.talk(); // dog调用talk()方法
  15. dog.eat(); // dog调用eat()方法
  16. /********* end *********/
  17. /********* begin *********/
  18. Cat cat = new Cat(catName,catSex,catWeight);// 通过有参构造函数实例化Cat类对象cat
  19. cat.talk();// cat调用talk()方法
  20. cat.eat(); // cat调用eat()方法
  21. /********* end *********/
  22. }
  23. }
  24. abstract class Pet {
  25. /********* begin *********/
  26. String name;// 构造函数初始化name和sex
  27. String sex;
  28. Pet(){} // 定义抽象类Pet,作为基类
  29. Pet(String name,String sex){ //类中定义2个
  30. this.name = name;//封装属性name
  31. this.sex = sex;//封装属性sex
  32. }
  33. public abstract void talk(); // 声明抽象方法talk()
  34. public abstract void eat(); // 声明抽象方法eat()
  35. /********* end *********/
  36. }
  37. class Dog extends Pet { // Dog类继承自Pet类
  38. /********* begin *********/
  39. String color;//封装属性color
  40. public Dog(String name,String sex,String color){
  41. this.name = name; // 构造函数初始化name、sex和color
  42. this.sex = sex;
  43. this.color = color;
  44. }
  45. public void talk(){ // 实现自己的talk()方法和eat()方法
  46. System.out.println("名称:" +name+ ",性别:" +sex+ ",颜色:" +color+ ",汪汪叫");
  47. } // talk()输出'名称:name,性别:sex,颜色:color,汪汪叫'
  48. public void eat(){ // eat()输出'name吃骨头'
  49. System.out.println(name+ "吃骨头!");
  50. }
  51. /********* end *********/
  52. }
  53. class Cat extends Pet { // Cat类继承自Pet类
  54. /********* begin *********/
  55. double weight;
  56. Cat(String name,String sex,double weight){
  57. this.name = name; // 构造函数初始化name、sex和weight
  58. this.sex = sex;
  59. this.weight = weight; //封装属性weight
  60. }
  61. // 实现自己的talk()方法和eat()方法
  62. public void talk(){
  63. System.out.println("名称:" +name+ ",性别:" +sex+ ",体重:" +weight+ "kg,喵喵叫");// talk()输出
  64. }
  65. public void eat(){
  66. System.out.println(name+ "吃鱼!"); // eat()输出
  67. }
  68. /********* end *********/
  69. }

报错总结 & 注意事项:

1.  最头疼的一个问题,没有代码,题目本身这里显示有问题。代码部分明明正确啊! 

2. 此处的new 后面应该是Dog类

Dog dog = new Dog(dogName,dogSex,dogColor);

3.此处后面无标点符号

 Pet(){}  

4. 抽象方法声明:

1.public(公有的):可以被该类的和非该类的任何成员访问。
2.private(私有的):仅仅可以被该类的成员访问,任何非该类的成员一概不能访问。(主要是隐藏数据来保证数据的安全性)
3.protected(保护的):仅仅可以被子类和类本身还有同一个包里的类访问

 public abstract void talk(); 

自动默认public类型,代码中所有的public都可以省去不写

第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 test;
  14. // 创建Person类对象person1,引用指向中国人,通过有参构造函数实例化中国人类对象
  15. Person person1 = new Chinese(cName,cSex, cAge);
  16. showEat(person1);// 通过showEat()方法调用Chinese的eat()方法
  17. //showEat(new Chinese(cName,cSex,cAge));
  18. // 创建Person类对象person2,引用指向英国人,通过有参构造函数实例化英国人类对象
  19. Person person2 = new English(eName,eSex,eAge);
  20. showEat(person2);// 通过showEat()方法调用English的eat()方法
  21. // 强制类型转换(向下转型) 调用Chinese类特有的方法shadowBoxing()
  22. /********* begin *********/
  23. Chinese d = (Chinese)person1;
  24. d.shadowBoxing();
  25. /********* end *********/
  26. // 强制类型转换(向下转型) 调用English类特有的方法horseRiding()
  27. /********* begin *********/
  28. English e = (English)person2;
  29. e.horseRiding();
  30. /********* end *********/
  31. }
  32. /********* begin *********/
  33. public static void showEat(Person p){// 定义showEat方法,使用父类作为方法的形参,实现多态
  34. p.eat();//传入的是哪个具体对象就调用哪个对象的eat()方法
  35. }
  36. /********* end *********/
  37. }
  38. abstract class Person {// 抽象类Person 封装属性name、sex和age
  39. /********* begin *********/
  40. public String name; // 构造函数初始化name、sex和age
  41. public String sex;
  42. public int age;
  43. abstract void eat();// 声明抽象方法eat()
  44. /********* end *********/
  45. }
  46. class Chinese extends Person { // Chinese类继承自Person类
  47. /********* begin *********/
  48. public String name; // 构造函数初始化name、sex和age
  49. public String sex;
  50. public int age;
  51. Chinese(String name,String sex,int age){
  52. this.name = name;
  53. this.sex = sex;
  54. this.age = age;
  55. }
  56. void eat(){// 重写父类方法eat()
  57. System.out.println("姓名:" +name+ ",性别:" +sex+ ",年龄:" +age+ ",我是中国人,我喜欢吃饭!");
  58. }
  59. void shadowBoxing(){// 定义子类特有方法,当父类引用指向子类对象时无法调用该方法 输出
  60. System.out.println(name+"在练习太极拳!");
  61. }
  62. /********* end *********/
  63. }
  64. class English extends Person { // English类继承自Person类
  65. /********* begin *********/
  66. String name;// 构造函数初始化name、sex和age
  67. String sex;
  68. int age;
  69. English(String name,String sex,int age){
  70. this.name = name;
  71. this.sex = sex;
  72. this.age = age;
  73. }
  74. void eat(){// 重写父类方法eat() 输出
  75. System.out.println("姓名:" +name+ ",性别:" +sex+ ",年龄:" +age+ ",我是英国人,我喜欢吃三明治!");
  76. }
  77. void horseRiding(){
  78. System.out.println(name+ "在练习骑马!");// 定义子类特有方法,当父类引用指向子类对象时无法调用该方法 输出
  79. }
  80. /********* end *********/
  81. }

报错总结 & 注意事项:

1.看见题目注释位置是单引号,一开始打了单引号

单引号:引的数据 是char类型的 单引号只能引一个字符(表示单个字符

双引号:双引号引的数据 是String类型的 而双引号可以引0个及其以上(引用字符串)

报错原因:定义的String类型

System.out.println(name+"在练习太极拳!");

 2. 最容易漏掉“   ;  ”

Java当中有分号,Python因为简单没有分号!

思维导图免费制作网站: 功能强大

https://www.processon.com/diagramshttps://www.processon.com/diagrams

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

闽ICP备14008679号