class A
{
int m=0,n=0;
long f()
{
return m+n;
}
}
class B extends A
{
int m=1,n=1;
long f ()
{
long result=0;
super.m=10;
super.n=20;
result=super.f()+(m+n);
return result;
}
long g()
{
long result=0;
result=super.f();
return result/2;
}
}
public class W7
{
public static void main(String args[])
{
B b=new B();
b.m=3;
b.n=7;
long resultOne=b.g();
long resultTwo=b.f();
long resultThree=b.g();
System.out.println("resultOne="+resultOne);
System.out.println("resultTwo="+resultTwo);
System.out.println("resultThree="+resultThree);
}
}的运行结果是
0
40
15怎么也没想明白会是这个结果?
到底怎么运算得来的
谁来说说看

解决方案 »

  1.   

    在Main中,new了一个B();
    这时会先调用其父类的构造函数(在此为默认的构造函数)。
    此时,其父类对象的域:m = 0; n = 0;
    而子类B的对象中的域赋值为:b.m = 3; b.n = 7;调用resultOne = b.g();
       在该方法中,父类对象中m = 0, n = 0; 所以super.f()返回0,即g()中result=0,所以结果为0。调用resultTwo = b.f();
       在该方法中为其父类对象的域又赋了值:super.m = 10; super.n = 20; 而当前对象的域:m = 3, n = 7;
       所以super.f() + (m+n) = (10+20) + (3+7) = 40;调用resultThree = b.g();
       此时经过上一句:resultTwo = b.f();已经为父类对象的域重新赋了值:super.m = 10; super.n = 20;
       所以在方法中,super.f()将返回30;
       所以现在输出为30/2 = 15.个人理解,你看看对不对。
      

  2.   

    class   A 

    int   m=0,n=0; 
    long   f() 

    return   m+n; 

    } class   B   extends   A 

    int   m=1,n=1; 
    long   f   () 

    long   result=0; 
    super.m=10; 
    super.n=20; 
    result=super.f()+(m+n); 
    return   result; 

    long   g() 

    long   result=0; 
    result=super.f(); 
    return   result/2; 



    class C extends A
    {
    void gg()
    {
    System.out.println("super.m="+super.m);
    System.out.println("super.n="+super.n);


    }
    }
    public   class   W7 

    public   static   void   main(String   args[]) 

    B   b=new   B(); 
    b.m=3; 
    b.n=7; 
    long   resultOne=b.g(); 
    long   resultTwo=b.f(); 
    long   resultThree=b.g(); 
    System.out.println("resultOne="+resultOne); 
    System.out.println("resultTwo="+resultTwo); 
    System.out.println("resultThree="+resultThree); 
    C c=new C();
    c.gg();


    可以看到 你原来的2个方法里,f方法已经改变了A类里的m和n的值,到了g方法里,因为是在一个类中,修改依然有效,当增加一个C类 继承A类,直接输出 super.m super.n 值依然为0,说明修改只在同一个子类里有效,个人觉得是这么一个意思同是初学者,不对多多指教。。