黑马程序员技术交流社区

标题: 关于多态的问题 [打印本页]

作者: 张权    时间: 2012-11-26 13:10
标题: 关于多态的问题
本帖最后由 张权 于 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,然后再请看,我主函数上面创建了一个静态的对象,如果那样就能运行。这是为什么呢?
作者: 潘天功    时间: 2012-11-26 13:35
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
没报错啊
作者: 郝少普    时间: 2012-11-26 13:39
你是拿父类去new的子类,当然没有b
多态是拿子类 去 new 父类, 这样说,不知道你懂了没
B b = new A a() 这样,  多看看 多态的知识
作者: 张权    时间: 2012-11-26 13:51
潘天功 发表于 2012-11-26 13:35
package Important_Code;
class A
{

把 B b = (B)a;这个强制转换注释掉!!!这样就报错了
作者: 张权    时间: 2012-11-26 14:12
刚一个QQ上的朋友帮我解决了,是这么回事,因为我虽然传进去一个b  但是callB方法里面的是(A a)  所以方法体里面没有B,会报错!!但是后来我声明了一个全局变量,那个全局变量所以方法体都能用,后来之所以能编译运行,用的并不是我传进去的那个b ,而是我定义的那个全局变量b

作者: 张权    时间: 2012-11-26 14:23
sp000 发表于 2012-11-26 13:39
你是拿父类去new的子类,当然没有b
多态是拿子类 去 new 父类, 这样说,不知道你懂了没
B b = new A a()  ...

  兄弟,你弄错了吧???这种写法是什么意思???




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2