楼主可以这么理解:假设有一个父类——人类(Human),两个它的子类男人(Man)和女人(Women)。
public abstract class Human{public abstract void eat();}
public class Man extends Human{public void eat(){} public void luguan(){} }
public class Man extends Human{public void eat(){}}
向上转型比如Human h=new Man();
你这么声明了一个human对象,他是通过man来实例化的
向下转型比如Man m=(Man)h;
你强制一个human对象转化为了man对象
向上转型有什么用呢?每个人类都能吃(eat),但是男人女人吃的不一样多,你通过向上转型声明的一堆人类对象,不管他是男人女人你都能调用他的eat方法,但是具体吃多少也就是eat方法怎么实现可以不同。向上转型还一个作用就是获得接口或者抽象类的实例化对象,你要是用过java的List的话你会知道他是个接口,java接口本身没有构造方法,所以你不能写List l=new List();但是你用他的子类就可以获得一个实例,你可以写List l=new ArrayList();
向下转型有什么用呢?你声明了一个Human对象h,他是用子类Man来实例化的,一般来说对于h你只能调用Human里有的方法而不能调用子类Man有而Human木有的方法。比如你饥渴难耐想要撸管(luguan方法),但是Human里没有luguan这个方法,h.luguan()就会报错。所以你可以强制吧h向下转换成Man类型,((Man)h).luguan()就是对的。向下转型有一定风险,因为有的human对象是用women实例化的如Human w=new Woman(),你把用women类的构造方法实例化的w强制转换为man就不行,因为他不是个爷们,即使你给她打扮的像男人一样他也不具备男人的功能,她无管可撸,所以((Woman)h).luguan()就会报错。
希望我的这个不很恰当的例子能帮助楼主理解这两个概念