b 并不是  Sub 类型的实例。
Base b = new Sub();
Sub s = (Sub)b; 
才会成立, 对象的实例是不可能改变的,创建了之后就总是那个类型的,你怎么 Cast 都一样,Cast 只是改变了 某些字段和方法的 可见性,向上 Cast 之后 Sub 中有些东西就看不到了,只能看到 Base 中的, 向下 Cast  就又能看到原来 Sub 中有的东西.  
对象的实例是什么类型的,永远不变。