向上转型当有子类对象赋值给一个父类引用时,多态本身就是向上转型的过程

父类引用指向子类对象

父类类型  变量名 = new 子类类型();

例如:Father father = new Son();//upcasting (向上转型), 对象引用指向一个Son对象

向下转型 一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用转为子类引用,这个过程是向下转型,向下转型必须以向上转型为前提。如果是直接创建父类对象,是无法向下转型的。

子类引用指向父类对象,前提是已经进行了向上转型

子类类型 变量名 = (子类类型) 父类类型的变量;

Son son = (Son) father;   //downcasting (向下转型),father还是指向Son对象

错误的情况:

Father f2 = new Father();

Son s2 = (Son) f2;//运行时出错,子类引用不能指向父类对象

向上转型与向下转型的使用:

package com.day04;

/**
 * @author SFJ
 * @date 2019/11/10
 * @time 21:48
 **/
public class Test1 {
    public static void main(String[] args) {
        Person person = new Student();//向上转型
        person.show();//调用子类重写方法
        System.out.println(person.age);
        Student student = (Student)person;//向下转型(前提是已经向上转型)
        student.study();//调用子类特有方法
    }
}
class Person
{
    private String name = "Sangfengjiao";
    int age = 21;
    public void show()
    {
        System.out.println(name);
    }
}
class Student extends Person
{
    public String grade;
    int age = 22;
    public void show()
    {
        System.out.println("Studet:Sang fengjiao");
    }
    public  void study()
    {
        System.out.println("student should study");
    }
}

向上转型的作用:可以以父类作为参数,使代码变得简洁

package com.day04;

/**
 * @author SFJ
 * @date 2019/11/10
 * @time 22:04
 **/
public class Test2 {
    public static void main(String[] args) {
        doeat(new Male());
        doeat(new Female());
    }
    public static  void doeat(Human human)//向上转型,子类对象作为参数
    {
        human.eat();
    }
}
class Human{
    public void eat()
    {
        System.out.println("Human eat......");
    }
}
class Male extends Human{
    public void eat()
    {
        System.out.println("Male eat.....");
    }
}
class Female extends Human{
    public void eat()
    {
        System.out.println("Female eat......");
    }
}

转型注意事项:

package com.day04;

/**
 * @author SFJ
 * @date 2019/11/10
 * @time 22:17
 **/
public class Test3 {
    public static void main(String[] args) {
        A a1 = new B();//向上转型
        a1.methoda();//调用父类方法,没有B类的方法,相当于父类对象
        B b1 = (B)a1;//向下转型,前提已经向上转型
        b1.methoda();//调用父类A方法
        b1.methodB();//调用B类方法
        b1.methodNew();
        A a2 = new A();
        B b2 = (B) a2; // 向下转型,编译无错误,运行时将出错
        b2.methoda();
        b2.methodB();
        b2.methodNew();

    }

}
class A
{
    void methoda()
    {
        System.out.println("A method");
    }
}
class B extends A{
    void methodB()
    {
        System.out.println("B method");
    }
    void methodNew()
    {
        System.out.println("BNew method");
    }
}
11-11 04:45