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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张权 中级黑马   /  2012-11-26 13:10  /  1056 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张权 于 2012-11-26 14:18 编辑

先看代码:
class A
{
                void func1()
                {
                                System.out.println("A func1 is calling");        
                }
                void func2()
                {
                                System.out.println("A func2 is calling");        
                }        
}
class B extends A
{
                void func1()
                {
                                System.out.println("B func1 is calling");        
                }        
                void func3()
                {
                                System.out.println("B func3 is calling");        
                }
}
class C
{
                //static B b = new B();
                public static void main(String[] args)
                {        
                                A a = new B();
                        //        B b = (B)a;
                                B b = new B();
                                //callB(new B());
                                //b.func3();
                                callB(b);                                                                                        //callA(b);
                                //callA(new B());
                                                
                }        
                public static void callA(A a)
                {
                                a.func1();
                                a.func2();        
                }
//                public static void callB(B b)//这个代码可以正常运行。
//                {
//                                //B b = (B)a;
//                                b.func1();
//                                b.func2();
//                                b.func3();
//                }
                public static void callB(A a)
                {
                                //B b = (B)a;
                                b.func1();
                                b.func2();
                                b.func3();
                }
}
上面代码会报错,找不到变量b,然后再请看,我主函数上面创建了一个静态的对象,如果那样就能运行。这是为什么呢?

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

5 个回复

倒序浏览
package Important_Code;
class A
{
                 void func1()
                 {
                                 System.out.println("A func1 is calling");        
                }
                 void func2()
                 {
                                 System.out.println("A func2 is calling");        
                }        
}
class B extends A
{
                 void func1()
                 {
                                 System.out.println("B func1 is calling");        
                }        
                void func3()
                 {
                                 System.out.println("B func3 is calling");        
                }
}
class C
{
                 public static void main(String[] args)
                 {        
                        
                                 B b = new B();
                                
                                 callB(b);                                                                                        //callA(b);
                                
                                                
                }        
                public static void callA(A a)
                 {
                                 a.func1();
                                 a.func2();        
                 }
        
                 public static void callB(A a)
                 {
                                 B b = (B)a;
                                 b.func1();
                                 b.func2();
                                 b.func3();
                 }
}

运行结果:
B func1 is calling
A func2 is calling
B func3 is calling
没报错啊

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
你是拿父类去new的子类,当然没有b
多态是拿子类 去 new 父类, 这样说,不知道你懂了没
B b = new A a() 这样,  多看看 多态的知识

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
潘天功 发表于 2012-11-26 13:35
package Important_Code;
class A
{

把 B b = (B)a;这个强制转换注释掉!!!这样就报错了
回复 使用道具 举报
刚一个QQ上的朋友帮我解决了,是这么回事,因为我虽然传进去一个b  但是callB方法里面的是(A a)  所以方法体里面没有B,会报错!!但是后来我声明了一个全局变量,那个全局变量所以方法体都能用,后来之所以能编译运行,用的并不是我传进去的那个b ,而是我定义的那个全局变量b
回复 使用道具 举报
sp000 发表于 2012-11-26 13:39
你是拿父类去new的子类,当然没有b
多态是拿子类 去 new 父类, 这样说,不知道你懂了没
B b = new A a()  ...

  兄弟,你弄错了吧???这种写法是什么意思???
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马