• 演示向上造型

  • 其实向上造型是多态的一种实现方式

  • 父类(接口)的引用可以指向子类的对象,展现出来的是父类(接口)的功能
  • 子类的引用变量可以指向子类的对象,展现出来的是子类的功能
  • 子类对象可以展现出多态的实现

  • 格式:

  • 父类类型 变量名 = new 子类的对象();
  • 接口名称 对象名 = new 实现类名称();
  • 变量名.方法名() - 父类当中的

  • 当多态出现以后,调用的方法是子类重写后的方法

  • 多态的使用场景:

  • 1.为变量复制的时候使用多态,达到父类的引用指向子类的对象,直接为变量赋值
  • 2.调用方法的时候,为方法的参数进行赋值
  • 3.方法的返回值,可以定义为父类的类型,但是返回的是子类的对象。当该方法被调用后,用父类的类型接收

  • 多态的好处:

  • 1.大大提高了程序的拓展性
  • 2.提高了程序的复用性

解决造型异常的方案:
使用一个instanceof关键字来判断对象是不是属于这个类型
最后会返回true或者false,进行了对象的判断后就可以保证不出异常

父类 - 动物类:

  1. /**
  2. * 父类 - 动物类
  3. *
  4. * 用于展示多态的抽象方法
  5. */
  6. package Test13_Demo.Demo08;/*
  7. @create 2020--12--01--15:15
  8. */
  9. public abstract class Animal {
  10. //普通方法
  11. public void eat() {
  12. System.out.println("吃饭");
  13. }
  14. //抽象方法
  15. public abstract void sleep();
  16. }

狗类 - 子类(具体类):

  1. /**
  2. *
  3. * 狗类 - 子类(具体类)
  4. *
  5. * 用于展示多态的实现
  6. * 再父类的共性功能外,有自己学习工作的方法
  7. */
  8. package Test13_Demo.Demo08;/*
  9. @create 2020--12--01--15:17
  10. */
  11. import Test13_Demo.Demo07.Animal;
  12. public class Dog extends Animal {
  13. @Override
  14. public void sleep() {
  15. System.out.println("睡在地上");
  16. }
  17. //拓展子类自己的方法
  18. //工作的方法
  19. public void work() {
  20. System.out.println("千里无极,万里追踪");
  21. }
  22. //重写父类方法
  23. @Override
  24. public void eat() {
  25. System.out.println("吃骨头");
  26. }
  27. }

人类 - 子类(具体类):

  1. /**
  2. *
  3. * 人类 - 子类(具体类)
  4. *
  5. * 用于展示多态的实现
  6. * 再父类的共性功能外,有自己学习工作的方法
  7. */
  8. package Test13_Demo.Demo08;/*
  9. @create 2020--12--01--15:17
  10. */
  11. import Test13_Demo.Demo07.Animal;
  12. public class Person extends Animal {
  13. @Override
  14. public void sleep() {
  15. System.out.println("睡在床上");
  16. }
  17. //拓展子类自己的方法
  18. public void study() {
  19. System.out.println("study");
  20. }
  21. //工作的方法
  22. public void work() {
  23. System.out.println("work");
  24. }
  25. //重写父类方法
  26. @Override
  27. public void eat() {
  28. System.out.println("吃饭");
  29. }
  30. }

测试类:

  1. /**
  2. *
  3. * 演示向上造型
  4. *
  5. * 其实向上造型是多态的一种实现方式
  6. * 父类(接口)的引用可以指向子类的对象,展现出来的是父类(接口)的功能
  7. * 子类的引用变量可以指向子类的对象,展现出来的是子类的功能
  8. * 子类对象可以展现出多态的实现
  9. *
  10. * 格式:
  11. * 父类类型 变量名 = new 子类的对象();
  12. * 变量名.方法名() - 父类当中的
  13. *
  14. * 当多态出现以后,调用的方法是子类重写后的方法
  15. *
  16. * 多态的使用场景:
  17. * 1.为变量复制的时候使用多态,达到父类的引用指向子类的对象,直接为变量赋值
  18. * 2.调用方法的时候,为方法的参数进行赋值
  19. * 3.方法的返回值,可以定义为父类的类型,但是返回的是子类的对象。当该方法被调用后,用父类的类型接收
  20. *
  21. * 多态的好处:
  22. * 1.大大提高了程序的拓展性
  23. * 2.提高了程序的复用性
  24. */
  25. package Test13_Demo.Demo08;/*
  26. @create 2020--12--01--15:21
  27. */
  28. import Test13_Demo.Demo07.Animal;
  29. import Test13_Demo.Demo07.Person;
  30. public class SubClassType {
  31. public static void main(String[] args) {
  32. //创建子类对象
  33. Person p = new Person();
  34. p.eat();
  35. p.sleep();
  36. p.work();
  37. p.study();
  38. //使用向上造型
  39. Animal a = new Person();
  40. //调用的父类中的方法,但是结果是子类中重写后的结果
  41. a.eat();
  42. a.sleep();
  43. /*a.work(); 调用不到*/
  44. System.out.println("---------拓展----------");
  45. //调用feed方法
  46. feed(new Person());//传入Animal的子类对象
  47. feed(new Dog());//传入Animal的子类对象
  48. /*feed(new Animal();//Animal是一个抽象类不能实例化*/
  49. }
  50. //封装一个方法,用于灵活的调用所有的方法 - 传入参数是一个父类
  51. public static void feed(Animal a) { //a是animal的引用,可以接收animal中所有的子类对象
  52. //调用该动物吃饭的方法
  53. System.out.println("feed方法内动物吃饭的方法被调用了");
  54. a.eat();
  55. }
  56. }