细节

  • 基本语法

    子类类型 引用名 = (子类类型)父类引用;

  • 只能强转父类的引用,不能强转父类的对象。

  • 要求父类的引用必须指向的是当前目标类型的对象。
  • 当向下转型后,可以调用子类类型中的所有成员。

    案例

    image.png

    Animal

    ```java package detail;

public class Animal { String name = “动物”; int age = 10;

  1. public void sleep() {
  2. System.out.println("睡");
  3. }
  4. public void run() {
  5. System.out.println("跑");
  6. }
  7. public void eat() {
  8. System.out.println("吃");
  9. }
  10. public void show() {
  11. System.out.println("hello,你好");
  12. }

}

  1. <a name="lKplh"></a>
  2. ## Cat
  3. ```java
  4. package detail;
  5. public class Cat extends Animal {
  6. @Override
  7. public void eat() {//方法重写
  8. System.out.println("猫吃鱼");
  9. }
  10. public void catchMouse() {//Cat特有方法
  11. System.out.println("猫抓老鼠");
  12. }
  13. }

Dog

  1. package detail;
  2. public class Dog extends Animal {//Dog是Animal的子类
  3. }

Main

  1. package detail;
  2. import java.util.Date;
  3. public class Main {
  4. public static void main(String[] args) {
  5. //向上转型: 父类的引用指向子类的对象
  6. //语法: 父类类型引用名 = new 子类类型();
  7. Animal animal = new Cat();
  8. //在Object面前,所有类都是儿子
  9. Object obj = new Cat();//可以吗? 可以 Object 也是 Cat的父类
  10. //向上转型调用方法的规则如下:
  11. //可以调用父类的所有成员(需要遵守访问权限)
  12. //但是不能调用子类的特有成员
  13. //animal.catchMouse();//报错!!!
  14. //因为在编译阶段,能调用哪些成员,是由编译类型来决定的
  15. //最终运行效果看子类(运行类型)的具体实现, 即调用方法时,按照从子类(运行类型)开始查找方法
  16. //子类中没有该方法时,然后从父类中开始寻找该方法。
  17. animal.eat();//猫吃鱼..
  18. animal.run();//跑
  19. animal.show();//hello,你好
  20. animal.sleep();//睡
  21. System.out.println("=====================");
  22. //使之可以调用Cat的catchMouse方法
  23. //多态向下转型
  24. //语法:子类类型 引用名 =(子类类型)父类引用;
  25. //cat 的编译类型 Cat,运行类型是 Cat
  26. Cat cat = (Cat) animal;
  27. cat.catchMouse();//猫抓老鼠
  28. //要求父类的引用必须指向的是当前目标类型的对象
  29. //Dog dog = (Dog) animal;//报错!!!
  30. }
  31. }

运行结果

image.png