标题:编译没错,但是运行就出错了!何解?
只看楼主
lizhigushuan
Rank: 1
等 级:新手上路
帖 子:22
专家分:5
注 册:2013-1-14
结帖率:60%
已结贴  问题点数:10 回复次数:8 
编译没错,但是运行就出错了!何解?
代码如下:
class A
{
    public void fun1()
    {
        System.out.println("A fun1 is calling");
        
    }
    public void fun2()
    {
        fun1();
    }
}
class B extends A
{
    public void fun1()
    {
        System.out.println("B fun1 is calling");
    }
    public void fun3()
    {
        System.out.println("B fun3 is calling");
    }
}
class C
{
    public static void main(String [] args)
    {
        B b= new B();
        callA(b);
        A a=b;
        callA(a);
        callA(new A());//我在这里引入一个A类的对象
        
    }
    public static void callA(A a)
    {
        B b=(B)a ;//这里就不能强制转换了,但是编译时没错的!!
        b.fun1();
        
        b.fun2();
        b.fun3();
    }
}
求高手指点!!
搜索更多相关主题的帖子: void static calling public 
2013-01-30 12:14
清微御宇
Rank: 6Rank: 6
来 自:开封
等 级:侠之大者
威 望:2
帖 子:318
专家分:497
注 册:2012-1-15
得分:2 
学习一下,这里(  B b=(B)a)可以直接下转型么?表示new A()转不过去吧?

[ 本帖最后由 清微御宇 于 2013-1-30 15:05 编辑 ]

Stay hungry , Stay foolish!
2013-01-30 14:54
付政委
该用户已被删除
得分:2 
回复 2楼 清微御宇
提示: 作者被禁止或删除 内容自动屏蔽
2013-01-30 16:05
hhwz
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:87
帖 子:687
专家分:4502
注 册:2011-5-22
得分:2 
public static void callA(A a) 应该是 public static void callA(Object a)
2013-01-30 16:52
shellingford
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:19
帖 子:228
专家分:1348
注 册:2010-8-9
得分:2 
首先编译不出错,运行出错很正常,java中RuntimeException就是一些运行时抛出的错误。

编译会对2个完全不相关的类强制转换时报错,例如你把Integer 强制转换成String

但是如果把父类强制转换成子类,编译时不会检查。
例如A a=new A();
a=new B();
B b=(B)a;
a变量可以指向类A和其所有子类的实例,所以究竟能否强转成B类型,只有在运行中才能判断。
2013-01-30 22:47
ren829
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:15
帖 子:255
专家分:1174
注 册:2006-3-11
得分:2 
以下是引用hhwz在2013-1-30 16:52:36的发言:

public static void callA(A a) 应该是 public static void callA(Object a)

public static void callA(A a)这个是没有问题的。
2013-02-02 00:14
ren829
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:15
帖 子:255
专家分:1174
注 册:2006-3-11
得分:0 
非要用向下转型的话,要这样改一下。
public static void main(String [] args)
    {
        B b= new B();
        callA(b);
        A a=b; // B a=new A(); 这样 B b=(B)a 的向下转型就是安全的。
        callA(a);
        callA(new A());//我在这里引入一个A类的对象

[ 本帖最后由 ren829 于 2013-2-2 00:28 编辑 ]
2013-02-02 00:26
lizhigushuan
Rank: 1
等 级:新手上路
帖 子:22
专家分:5
注 册:2013-1-14
得分:0 
回复 3楼 付政委
我是问你问题。。你问这个。真是的
2013-02-02 10:07
lizhigushuan
Rank: 1
等 级:新手上路
帖 子:22
专家分:5
注 册:2013-1-14
得分:0 
回复 5楼 shellingford
哦,懂了。。谢谢大神
2013-02-02 10:10



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-397901-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.075542 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved