日期:2014-05-20  浏览次数:20684 次

为什么运行的结果是这样的?
package   com.qijian;

public   class   InnerClass   {
static   private   int   k   =   5;

private   void   d()   {
System.out.println( "java ");
k--;
System.out.println(k);
}

class   inner   {
void   f(int   k)   {
                                                 
d();
System.out.println(k);
}
}

public   static   void   main(String[]   args)   {
InnerClass   j   =   new   InnerClass();
InnerClass.inner   i   =   j.new   inner();
i.f(k);
InnerClass.inner   a   =   j.new   inner();
a.f(k);

}

}

运行的结果是    
java
4
5
java
3
4
为什他没有公用那个K,内部类与外部类没有公用K,K结果不是想象的4,3,2,1

------解决方案--------------------
你在进行
InnerClass.inner i = j.new inner();
i.f(k);
时,读到K的值是5,让将这个值传到d()中,进行打印“Java”,所以输出“Java”;
再--, 所以输出“4”;
调用d()结束返回到f(),打印K的值,注意这里还是已开始读进的5,所以输出5;
进行
InnerClass.inner a = j.new inner();
a.f(k);
与上面过程类似。


------解决方案--------------------
怎么样都不会是4321

至于你的问题
是因为void f(int k)方法里面局部的k
把外面的static 的k“屏蔽”掉了
因为前者的作用域小
你换一个名字就可以达到你的预期了
------解决方案--------------------
换句话说,在
void f(int k) {

d();
System.out.println(k);
}
里,System.out.println(k);调用的k是在void f(int k)中定义的k,而不是static private int k = 5。局部变量优先原则。
你可是把System.out.println(k);和void f(int k)中的“k”换成字幕“m”在运行一下,结果是一样的。