A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邱成 中级黑马   /  2012-9-6 10:54  /  1298 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 邱成 于 2012-9-7 08:12 编辑

package me.luger.base;

public class OverrideTest1 {
    public static void main(String[] args) {
        Sub2 sub = new Sub2();
        Sup sup = new Sup();
        sub = (Sub2) sup;
        sub.method();
    }
}

class Sup{
    public void method(){
        System.out.println("father");
    }
}

class Sub2 extends Sup{
    public void method() {
        System.out.println("children");
    }
}



我写的向下转型的例子 运行的时候报错,这么向下转型不行的吗?

4 个回复

倒序浏览
本帖最后由 吴兵 于 2012-9-6 11:34 编辑

举个简单的例子你就明白了,动物是父类,小狗是子类, 小狗一定是动物,但是动物不一定是小狗。 子类型可转换为父类型,父类型不能转换为子类型。


/**
*  两种类型的强制类型转换:
1) 向上类型转换(upcast)  :   比如说将 Dog 类型转换为 Animal 类型,即将子类型 转换为父类型。对于向上类型转换,不需要显式指定。
2) 向下类型转换(downcast):比如将 Animal 类型转换为 Dog类型。即将父类型转换为子类型(new Dog()本身就是子类的对象,只是使用了父类的引用a指向它)。对于向下类型转换,必须要显式指定(必须要使用强制类型转换)。

*/
package bbs;

public class PolyTest
{
        public static  void main(String[] args)
        {
               
                //向上类型转换
                Dog dog = new Dog();

                Animal animal = dog;

                animal.run();

                //向下类型转换
                Animal a = new Dog();

                Dog d = (Dog)a;

                d.run();

        }
}

class Animal
{
        public void run()
        {
                System.out.println("animal is run");
        }
}

class Dog extends Animal
{
        public void run()
        {
                System.out.println("dog is run");
        }
}

回复 使用道具 举报
楼主写错了吧
Sub2 sub = new Sub2();
Sup sup = new Sup();
sub = (Sub2) sup; //这样写相当于 sub =(Sub2)(new Sup());了
sub.method();

sub是子类型,而sup是父类型的,只有在多态中才可以,Sup s = new Sub2();
Sub2 s2=(Sub2)s;
即 Animal a = new Cat();
Cat c=(Cat)a;
楼主的写法相当于这样了:是不能把动物强转成猫的
Animal a = new Animal();
Cat c = new Cat();
c=(Cat)a;

回复 使用道具 举报
本帖最后由 武庆东 于 2012-9-6 11:41 编辑

package me.luger.base;

public class OverrideTest1 {
    public static void main(String[] args) {
        Sub2 sub = new Sub2();
        Sup sup = new Sup();
        sub = (Sub2) sup;/* 我写的向下转型的例子 运行的时候报错,这么向下转型不行的吗?不可以,向下转型的时必须在初始化阶段,就声明向下转换的父类,格式如下:
     子类 子类对象=(子类)父类对象*/
        sub.method();
    }
}

class Sup{
    public void method(){
        System.out.println("father");
    }
}

class Sub2 extends Sup{
    public void method() {
        System.out.println("children");
    }
}
对于向上类型的,程序会自动完成,对于向下类型的转换,必须声明指出要转型的子类类型
回复 使用道具 举报
要上下转型,就要先向上转型,否则会报类型转换异常ClassCastException,
public static void main(String[] args) {
        Sup sup = new Sub2();//你要添加一个向上转型
            Sub2 sub = new Sub2();
            sub = (Sub2)sup;
        sub.method();
    }
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马