细节
基本语法
子类类型 引用名 = (子类类型)父类引用;
只能强转父类的引用,不能强转父类的对象。
- 要求父类的引用必须指向的是当前目标类型的对象。
- 当向下转型后,可以调用子类类型中的所有成员。
案例
Animal
```java package detail;
public class Animal { String name = “动物”; int age = 10;
public void sleep() {
System.out.println("睡");
}
public void run() {
System.out.println("跑");
}
public void eat() {
System.out.println("吃");
}
public void show() {
System.out.println("hello,你好");
}
}
<a name="lKplh"></a>
## Cat
```java
package detail;
public class Cat extends Animal {
@Override
public void eat() {//方法重写
System.out.println("猫吃鱼");
}
public void catchMouse() {//Cat特有方法
System.out.println("猫抓老鼠");
}
}
Dog
package detail;
public class Dog extends Animal {//Dog是Animal的子类
}
Main
package detail;
import java.util.Date;
public class Main {
public static void main(String[] args) {
//向上转型: 父类的引用指向子类的对象
//语法: 父类类型引用名 = new 子类类型();
Animal animal = new Cat();
//在Object面前,所有类都是儿子
Object obj = new Cat();//可以吗? 可以 Object 也是 Cat的父类
//向上转型调用方法的规则如下:
//可以调用父类的所有成员(需要遵守访问权限)
//但是不能调用子类的特有成员
//animal.catchMouse();//报错!!!
//因为在编译阶段,能调用哪些成员,是由编译类型来决定的
//最终运行效果看子类(运行类型)的具体实现, 即调用方法时,按照从子类(运行类型)开始查找方法
//子类中没有该方法时,然后从父类中开始寻找该方法。
animal.eat();//猫吃鱼..
animal.run();//跑
animal.show();//hello,你好
animal.sleep();//睡
System.out.println("=====================");
//使之可以调用Cat的catchMouse方法
//多态向下转型
//语法:子类类型 引用名 =(子类类型)父类引用;
//cat 的编译类型 Cat,运行类型是 Cat
Cat cat = (Cat) animal;
cat.catchMouse();//猫抓老鼠
//要求父类的引用必须指向的是当前目标类型的对象
//Dog dog = (Dog) animal;//报错!!!
}
}