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

解决方案 »

  1.   

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

  2.   

    关键在这callA(new A());
    这里面是从新生成的一个A对象。和你上面的赋值没有任何的关系
    所以后面输出的就是2个A的
      

  3.   

    callA(new A());
    你这里传了个A的类
    if(a instanceof B)
    条件不符合,不就执行a.func1();
    a.func2();
    A func1 is calling
      

  4.   

    JAVA里除了基本类型以外都是引用,记这点就好啦
      

  5.   

    这里称a是b的上转型对象,其意义是让a这个对象能调用类B中重载的方法和变量,而类B中新写的变量和方法a是不能调用的.