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

解决方案 »

  1.   

    当然是公用的
    i.f(k);  k=5,
      调用到d(),k=4
      因此输出4 5
    a.f(k)   k=4
      调用d(),k=3
      因此输出3 4
      

  2.   

    你在进行
    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);
    与上面过程类似。
      

  3.   

    为什么
    void f(int k) {
                             
    d();
    System.out.println(k);
    }
    中d()调用后的K--对接下来的System.out.println(k);没其到作用呢,这个K仍然是刚传进来时候的值
      

  4.   

    在 函数:
    void f(int k) {
                             
    d();
    System.out.println(k);
    }
    里,k是作为局部变量传递进去的。你的混淆在这里吧。
      

  5.   

    怎么样都不会是4321至于你的问题
    是因为void f(int k)方法里面局部的k
    把外面的static 的k“屏蔽”掉了
    因为前者的作用域小
    你换一个名字就可以达到你的预期了
      

  6.   

    很好解施,外部类和内部类个有一个int的变量,还都叫K,所以你迷惑了.
      

  7.   

    换句话说,在
    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”在运行一下,结果是一样的。