首先观察下面代码:
class Sum{ int n; float f(){ float sum=0; for(int i=1;i<=n;i++){ sum=sum+i; } return sum; } } class Average extends Sum{ int n; float f(){ float c; super.n=n; c=super.f(); return c/n; } float g(){ float c; c=super.f(); return c/2; } } public class Example5_7 { public static void main(String[] args) { // TODO code application logic here Average aver=new Average(); aver.n=100;//已经为子类的n赋值 **float resultTwo=aver.g();**//注意 **float resultOne=aver.f();**//注意 System.out.println("resultOne="+resultOne); System.out.println("resultTwo="+resultTwo); } }运行截图: 发现resultTwo运行结果竟然是0!!why?!可以看到resultTwo调用的是aver.g(),观察g()函数,发现里面又调用了父类的f()函数,这时候你就会观察到问题所在了,父类的n竟然没有被赋值!!那就就难怪会输出一个莫名奇妙的数字了。 改进一:
class Sum{ int n; float f(){ float sum=0; for(int i=1;i<=n;i++){ sum=sum+i; } return sum; } } class Average extends Sum{ int n; float f(){ float c; super.n=n; c=super.f(); return c/n; } float g(){ float c; **super.n=n;**//添加 c=super.f(); return c/2; } }运行结果截图: 在父类f()函数中添加super.n=n,为父类的n赋值。 改进二:
public class Example5_7 { public static void main(String[] args) { // TODO code application logic here Average aver=new Average(); aver.n=100; float resultOne=aver.f();// float resultTwo=aver.g(); //调换这两句话的位置 System.out.println("resultOne="+resultOne); System.out.println("resultTwo="+resultTwo); } }运行结果截图: 在子类f()函数中调用super.n=n,间接为父类的n中传值,使得父类中g()函数n有值(仔细想想 这代表了什么…),程序运行成功,但还是推荐改进一的方法。