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
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
i.f(k); k=5,
调用到d(),k=4
因此输出4 5
a.f(k) k=4
调用d(),k=3
因此输出3 4
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);
与上面过程类似。
void f(int k) {
d();
System.out.println(k);
}
中d()调用后的K--对接下来的System.out.println(k);没其到作用呢,这个K仍然是刚传进来时候的值
void f(int k) {
d();
System.out.println(k);
}
里,k是作为局部变量传递进去的。你的混淆在这里吧。
是因为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”在运行一下,结果是一样的。