先看代码:
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() ...