日期:2014-05-20  浏览次数:20616 次

有个程序的某个地方看不明白,请大家帮帮忙
class   A
{
public   void   func1()
{
System.out.println( "A   func1   is   calling ");
}
public   void   func2()
{
func1();
}
}
class   B   extends   A
{
public   void   func1()
{
System.out.println( "B   func1   is   calling ");
}
public   void   func3()
{
System.out.println( "B   func3   is   calling ");
}
}

class   C
{
public   static   void   main(String   []   args)
{
B   b   =   new   B();
callA(b);
A   a   =   b;     //请问这句是不是将对象b的值赋给了对象a,可是为什麽结果的最后两句却还是A   func1   is   calling
callA(new   A());
}
public   static   void   callA(A   a)
{
if(a   instanceof   B)
{
B   b   =   (B)a;
b.func1();
b.func2();
b.func3();
}
a.func1();
a.func2();
}
}

最后的结果是
B   func1   is   calling
B   func1   is   calling
B   func3   is   calling
B   func1   is   calling
B   func1   is   calling
A   func1   is   calling
A   func1   is   calling



------解决方案--------------------
A a = b;
public static void callA(A a)
一个是参数a,一个是变量,不要混了,
callA(new A());
这里你new 一个A类的实例 它与B类当然不兼容
也就是说a instanceof B等于false


------解决方案--------------------
关键在这。。。callA(new A());
这里面是从新生成的一个A对象。和你上面的赋值没有任何的关系
所以后面输出的就是2个A的
------解决方案--------------------
callA(new A());
你这里传了个A的类
if(a instanceof B)
条件不符合,不就执行a.func1();
a.func2();
A func1 is calling
------解决方案--------------------
JAVA里除了基本类型以外都是引用,记这点就好啦