需要掌握的知识点
同一个引用类型,使用不同的实例而执行不同操作
父类类型 变量 = new 子类A构造器(形参);
父类类型 变量 = new 子类B构造器(形参);
下面是一个例子:父亲类型当做方法参数,父亲类型可以接受子类的类型
//打印机父类
public class Printer {
    String Name = "Father!!";
	public void print() {
		System.out.println("Print father!");
	}
}
//打印机黑白
public class BPrinter extends Printer{
    String Name = "BLACK!!";
	@Override
	public void print() {
		// TODO Auto-generated method stub
		System.out.println("黑白纸张!!");
	}
}
//打印机彩色
public class CPrinter extends Printer{
    String Name = "BLACK!!";
	@Override
	public void print() {
		// TODO Auto-generated method stub
		System.out.println("彩色纸张!!!");
	}
}
public class Master {
	//父亲类型当做方法参数!
	public void mprint(Printer p ) {
		p.print();
	}
	
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
        //如果子类方法重写,调用的是子类的方法
		Master Jeason = new Master();
		BPrinter p1 = new BPrinter();
		CPrinter p2 = new CPrinter();
		Jeason.mprint(p1);
		Jeason.mprint(p2);
        //调用的父类成员变量
        Printer p = new BPrinter();
		System.out.println( p.name );
	}
}   
// 输出:
// 黑白纸张!!
// 彩色纸张!!!
// printer father!!
上面的这个过程叫做向上转型。
总结一下:
向下转型就是父类转换成子类(强制转换)
前提是要先进行向上转型:
Printer p = new BPrinter();
BPrinter p3 = (BPrinter)p;
其中我们可以借用instanceof运算法先进性判断,随后进行强制转换
原文:https://www.cnblogs.com/JeasonIsCoding/p/13232487.html