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怎么也没想明白会是这个结果?
到底怎么运算得来的
谁来说说看
{
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怎么也没想明白会是这个结果?
到底怎么运算得来的
谁来说说看
这时会先调用其父类的构造函数(在此为默认的构造函数)。
此时,其父类对象的域: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.个人理解,你看看对不对。
{
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,说明修改只在同一个子类里有效,个人觉得是这么一个意思同是初学者,不对多多指教。。