1.多态【重要】

java面向对象的三大特性:封装 继承 多态。

封装:对属性进行封装;

继承:子类继承父类;

多态:方法和对象具有多种形态。

1.1方法的多态

方法的重写和方法的重载就是方法的多态。

1.2对象的多态【重点】

  1. 1.一个对象的编译类型和运行类型可以不一样;
  2. 2.编译类型在定义对象的时候,就确定了不能改变;
  3. 3.运行类型是可以改变的;
  4. 4.编译类型看定义在等号(=)左边的,运行类型看等号(=)右边的;
  5. 5.父类的引用指向子类的对象(父类的引用不能调用子类独有的方法)

注意事项:

父类的引用指向子类的对象:

  1. 1.一定要有继承和重写;
  2. 2.=左边是父类的引用,=右边是子类的对象

案例在开发中的具体应用【重点】

  1. package com.qfedu.test1duotai;
  2. //多态练习题2
  3. public class Test2 {
  4. public static void main(String[] args) {
  5. Mannger mannger = new Mannger();
  6. PersonQF personQF = new Student();
  7. mannger.manage(personQF);
  8. PersonQF personQF2 = new Teacher();
  9. mannger.manage(personQF2);
  10. mannger.manage(new Emoployee());
  11. }
  12. }
  13. class PersonQF{
  14. public void excute() {//执行
  15. System.out.println("千峰手册");
  16. }
  17. }
  18. class Student extends PersonQF{//学员
  19. public void excute() {//执行
  20. System.out.println("学生手册");
  21. }
  22. }
  23. class Teacher extends PersonQF{//讲师
  24. public void excute() {//执行
  25. System.out.println("学生手册");
  26. }
  27. }
  28. class Emoployee extends PersonQF{//员工
  29. public void excute() {//执行
  30. System.out.println("员工手册");
  31. }
  32. }
  33. class Mannger{//管理(manage)学生、讲师、员工
  34. public void manage(PersonQF personQF) {
  35. personQF.excute();
  36. }
  37. }

1.3.1多态的向上转型

本质:父亲的引用指向子类的对象

语法格式:父亲类型 引用名 = new 子类的引用();

总结:向上转型,只能调用父类有的方法,不能调用子类独有的方法

1.3.2多态的向下转型

语法格式:子类类型 引用名 = (子类类型)父类的引用;

  1. 大转小,需要强转。只能强转父类的引用,不能强转父类的类型

注意事项:一定先向上转型,在进行向下转型。如下

  1. Animal animal = new Cat();
  2. Cat cat = (Cat)animal;
  3. cat.run();

案例:

  1. package com.qfedu.test1duotai3;
  2. //多态的向下转型
  3. public class Demo1 {
  4. public static void main(String[] args) {
  5. //向下转型
  6. //子类类型 引用名 = (子类类型)父类的引用;
  7. // Animal animal = new Animal();//错误演示
  8. // Cat cat = (Cat)animal;
  9. // cat.run();
  10. Animal animal = new Cat();
  11. Cat cat = (Cat)animal;
  12. cat.run();
  13. cat.catchMouse();
  14. Animal animal2 = new Dog();
  15. Dog dog = (Dog)animal2;
  16. dog.run();
  17. }
  18. }
  19. class Animal{
  20. public void run() {
  21. System.out.println("动物会奔跑");
  22. }
  23. }
  24. class Cat extends Animal{
  25. @Override
  26. public void run() {
  27. // TODO Auto-generated method stub
  28. System.out.println("猫走猫步");
  29. }
  30. public void catchMouse() {
  31. System.out.println("猫抓老鼠");
  32. }
  33. }
  34. class Dog extends Animal{
  35. @Override
  36. public void run() {
  37. // TODO Auto-generated method stub
  38. System.out.println("狗跑的飞快");
  39. }
  40. }

1.4instanceOF 关键字【现在已经不用了】

比较操作符,返回值是一个布尔类型boolean

用于判断对象的对象的运行类型 (=右边) 是否是XX类型或者XX类型子类,目的是强转不出错

语法格式: 对象的引用 instanceOF 运行类型

  1. package com.qfedu.test1duotai3;
  2. public class Demo2instanceOF {
  3. public static void main(String[] args) {
  4. BB bb = new BB();
  5. //语法格式: 对象的引用 instanceOF 运行类型
  6. //判断bb是否是类的类型或者这个类的子类类型
  7. System.out.println(bb instanceof BB);
  8. //bb这个对象 判断它是否是AA的子类类型
  9. //因为BB继承了AA
  10. System.out.println(bb instanceof AA);
  11. AA aa = new BB();
  12. System.out.println(aa instanceof BB);
  13. System.out.println(aa instanceof AA);
  14. AA aa1 = new AA();
  15. System.out.println(aa1 instanceof BB);//F
  16. System.out.println(aa1 instanceof AA);
  17. System.out.println("-------------------");
  18. Object object = new Object();
  19. System.out.println(object instanceof AA);
  20. System.out.println(object instanceof Object);
  21. String string = "zzw";
  22. System.out.println(string instanceof Object);
  23. }
  24. }
  25. class AA{}//父类
  26. class BB extends AA{}//子类