首先观察下面代码:
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有值(仔细想想 这代表了什么…),程序运行成功,但还是推荐改进一的方法。