多态的转型【重点】
多态的向上转型
就是父类的引用指向了子类的对象
语法格式:
父类 父类的引用 = new 子类();
向上转型是自动转的将子类的对象赋值 父类的引用呢 小范围(子类)转为大范围(父类)的 是可以自动转的。
父类的引用可以调用父类的所有的方法,但是不能调用子类独有的方法。最终的调用结果看的是子类中重写的方法的
package com.qf.d_duotai;
class Person {
public void eat() {
System.out.println("吃饭");
}
}
class Student extends Person {
@Override
public void eat() {
System.out.println("吃有营养的东西");
}
}
public class Demo1 {
public static void main(String[] args) {
Person person = new Student();//向上转型 父类的引用指向子类的对象
person.eat();
}
}
多态的向下转型
语法格式:
父类 父类的引用 = new 子类(); 子类 子类的引用 = (子类) 父类的引用; 强制类型转换
package com.qf.d_duotai;
class Animal {
public void eat() {
System.out.println("得吃饭");
}
}
class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗吃香肠");
}
}
class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃老鼠");
}
}
public class Demo2 {
public static void main(String[] args) {
//演示语法格式
Animal animal = new Dog();//父类 父类的引用 = new 子类(); 向上转型
//向下转型 子类 子类的引用 = (子类) 父类的引用;
// Dog dog1 = (Dog)animal;//强转 在强转的时候一定先向上转 然后再向下转才不会报错的
// dog1.eat();
/**
* ClassCastException(类转换异常): com.qf.d_duotai.Animal cannot be cast to com.qf.d_duotai.Dog
at com.qf.d_duotai.Demo2.main(Demo2.java:32)
*/
这个是错误的代码
// Animal animal2 = new Animal();
// Dog dog2 = (Dog) animal2;
//
//Exception in thread "main" java.lang.ClassCastException: com.qf.d_duotai.Dog cannot be cast to com.qf.d_duotai.Cat
//at com.qf.d_duotai.Demo2.main(Demo2.java:38)
// Cat cat1 = (Cat)animal;
// Dog dog1 = new Dog();
}
}
想用向下转型的话,必须先向上转型
package com.qf.e_duotai;
class Person {
//父类 父类引用 = new 子类();
//子类 子类的引用 = (子类) 父类的引用;
public void test (Animal animal ) {
//要求你必须给我打印的类型是Dog类型 咋办
//父类的引用能执行子类独有的方法
// animal.eat();
//父类中不允许有eat方法,但是我想就想调用 Dog下面的eat方法 咋办?
Dog dog = (Dog)animal;//向下转型
dog.eat();
}
}
class Animal {
}
class Dog extends Animal{
public void eat () {
System.out.println("吃大骨头");
}
}
class Cat extends Animal{
public void eat () {
System.out.println("吃鱼");
}
}
public class Demo2 {
public static void main(String[] args) {
Animal animal = new Dog();
Person person = new Person();
//test方法的参数是 一个Animal类型, 实参是子类
person.test(animal);
/**
* Exception in thread "main" java.lang.ClassCastException: com.qf.e_duotai.Cat cannot be cast to com.qf.e_duotai.Dog
at com.qf.e_duotai.Person.test(Demo2.java:11)
at com.qf.e_duotai.Demo2.main(Demo2.java:36)
*/
Animal animal2 = new Cat();
person.test(animal2);
}
}