猿问

Java中向上转型和向下转型问题

先上代码:UpDownFather.java文件 

package test;


public class UpDownFather {

    public static void main(String args[]) {

        UpDownFather upDownFather = new UpDown();

        UpDown upDown = (UpDown) upDownFather;

        System.out.println(upDown.hashCode());

    }

}

类:UpDown.java文件

package test;


public class UpDown extends UpDownFather {

    public static void main(String args[]) {

        UpDown upDown = new UpDown();

        // 父类可以接收子类

        UpDownFather upDownFather = (UpDownFather) upDown;

        System.out.println(upDownFather.hashCode());

    }

}

上述两种方式,都会编译运行通过。但是下面这种方式,编译通过,运行抛异常:

package test;


public class UpDownFather {

    public static void main(String args[]) {

        UpDownFather upDownFather = new UpDownFather();

        UpDown upDown = (UpDown) upDownFather;

        System.out.println(upDown.hashCode());

    }

}



順便問一下,我提出的問題,如何格式化代碼?有點兒格式混亂啊。


富国沪深
浏览 739回答 7
7回答

慕少森

至尊宝的传说

你没有把两个类之间的关系说出来,所以不是很清楚。格式化代码的话 eclipse 使用 Ctrl+shift+f 格式化代码,注意搜狗会占用快捷键,intellij idea Windows 我忘记了,在 mac 下使用 alt+command+L

繁花如伊

upDownFather这个对象本身就不是UpDown类型的,改成下面这样就行了UpDownFather upDownFather = new UpDown();UpDown upDown = (UpDown) upDownFather;System.out.println(upDown.hashCode());强制类型转换的时候,目标类型必须是该对象的真实类型或者父类才可以,这里UpDown类型不是upDownFather对象的真实类型,也不是upDownFather的父类类型,所以会失败。

慕尼黑的夜晚无繁华

子类能转换成父类,无需强制转换。父类无法转换成子类,即便加上强制转换,运行时还是会抛出类匹配错误。

月关宝盒

向下转型当然可以,但是安全地做法是先用instanceof判断一下。

米脂

class A{}class B{}class Main{    static Object a = new A();    static B b = (B)a;    public static void main(String[] args) {        System.out.println(b.hashCode());    }}楼主这种方式编译也不会有问题。
随时随地看视频慕课网APP

相关分类

Java
我要回答