向上转型:把一个子类类型安全地变为父类类型的赋值,被称为向上转型(upcasting)。

向上转型也就是多态的使用。

public class UpcastingTest {
    public static void main(String[] args) {
        Person person = new Person();
        Student student =new Student();
        Person p = new Student();//把一个子类类型安全地变为父类类型的赋值
    }
}
class Person{
    String name ="张三";
    public void eat(){
        System.out.println("人吃饭");
    }
}
class Student extends Person{
    int id =1001;
    public void study(){
        System.out.println("学生学习");
    }
}

向下转型:和向上转型相反,如果把一个父类类型强制转型为子类类型,就是向下转型(downcasting)

public class UpcastingTest {
    public static void main(String[] args) {

        Person person = new Student();//把一个子类类型安全地变为父类类型的赋值
         = "李四";          //可以调用父类中声明的属性
        person.eat();                  //可以调用父类中声明的方法
        //p.study();无法调用子类特有的属性和方法
        //有了多态性以后,内存中实际上是加载了子类特有的属性和方法,但是由于声明的是父类类型,
        // 导致编译时,只能调用父类声明的方法和属性,子类特有的属性和方法无法调用
        //如何才能调用子类中特有的属性和方法?
        //使用强制类型转换
        Student student = (Student) person;//当前的p指向Student()的实例,所以强转为Student类型可以成功
        student.study();
        student.id = 1002;//现在就可以调用子类所特有的属性和方法了

        //继续看下面的代码
        Person man = new Person();
        Student s1 = (Student) man;//执行会报错,报错原因是ClassCastException类型转换异常
        //因为man指向的实例是Person()、将man在强制转换为(Student)就失败了,必须是同类型的才能转换成功!

    }
}
class Person{
    String name ="张三";
    public void eat(){
        System.out.println("人吃饭");
    }
}
class Student extends Person{
    int id =1001;
    public void study(){
        System.out.println("学生学习");
    }
}