其实这是一个很简单的问题,也很容易理解的,今天遇到一个同事问我子类怎么不能转父类,这些是在刚学C语言的时候应该就教过了!其实如果非要把两个类关联起来也并不一定要
继承,把一个类做成另一个类的属性也可以,当然如果父类是自己写的或是调用的方法中是可以自己实例化的话,那用向下转型就可以了,但是在使用向下转型的时候,请一定要记住
父类对象一定是子类对象的实例才可以转哦!
package com.taobao.frame.common; public class Demo { public static void main(String[] args) { /** * 向上转型 狗是动物 */ Animal species = new Dog(); species.say(); } } /** * 动物 */ class Animal{ public void say(){ System.out.println("动物在说话..."); } } /** * 狗 */ class Dog extends Animal{ public void say(){ System.out.println("狗在说话..."); } }
这是向上转型的方法,这种应该是用得最多的了。打印出来当然也就是“狗在说话...”啦!很多人想向下转型不过就是把父类转成子类,可能有些人在main方法中就会这样写
public static void main(String[] args) { /** * 向下转型 动物是狗 Animal cannot be cast to Dog */ Dog species = (Dog) new Animal(); species.say(); }
编译的时候不会报错,但是从逻辑上也说不通,说动物就是狗,鸡是动物,那鸡也是狗吗?很显然不是的,所以在运行的时候就会报错,提示:Animal cannot be cast to Dog,动物不成强转成狗,不是要
向下转型吗?那当什么情况下能说动物是狗呢?当然也就是当你指明了那只动物是狗的情况下,你再说那只动物是狗,那肯定是没错的!所以代码应该如下:
public static void main(String[] args) { /** * 向下转型 先指定那个动物是狗,再说那只动物是狗 */ Animal species = new Dog(); if(species instanceof Dog){ //判断一下那只到底是不是狗 species = new Dog(); species.say(); } }
先向上转型,才可以向下转型,打印的结果自然也是:“狗在说话...”。
为此希望还模糊在向上转型和向下转型的童鞋,看到文章能有个大概了解。