静态变量的一个问题

来源:百度知道 编辑:UC知道 时间:2024/05/27 01:47:09
public class TestStatic {
static int i = 0;
public static void main(String[] args) {
int i = 8;
TT t = new TT();
t.m();
t.i = 9;
System.out.print(i);
}
}

class TT {
int i = 18;
void m() {
TestStatic ts = new TestStatic();
System.out.print(TestStatic.i+" ");
System.out.print(ts.i+" ");
}
}

输出结果是0 0 8为什么??int i = 18和t.i = 9改变的是什么??如果将int i = 8换成i = 8,结果不一样了,为什么?
一涉及到静态问题,就总会乱,有没有能很好的理解静态的问题的方法??高手们指导下~~~谢谢了

首先这个程序的执行先是从main方法开始的;
当你执行main方法第一句时:定义了一个局部整型变量i并将其初始化为8
当执行这句TT t = new TT(); 时,系统在栈空间里分配了一个空间存放对象t,在堆内存里分配了一个空间存放其对象的成员变量i=18;

当执行到第三句时,由于对象t调用了它本身的m方法,所以此时执行m方法的第一句TestStatic ts = new TestStatic(); 和上面的执行过程一样,只不过他的成员变量i=0是静态的,所以存放在内存的datasegment(数据区,和其他的栈、堆不同);
接着执行这句:System.out.print(TestStatic.i+" ");这时静态的i的值还是0
下句System.out.print(ts.i+" "); 调用的是ts这个对象的成员变量i,值当然还是0了

m方法执行完毕,继续执行main方法:t.i = 9; 改变了t这个对象的成员变量i,即把原来i的值18改为9;

接下来这个就比较有意思了:System.out.print(i);它到底打印的是main方法的成员变量i还是静态变量i(当然在静态方法中是可以访问静态成员变量的)??java编译器认为,在两个变量名相同时,先访问离它最近的变量(在此为局部变量i=8),所以此时打印出的是8,不信你可以将局部变量i的名字改一下,然后再打印i,出来就成000了
说明打印的是静态成员变量i

不知道这样说你能明白不??

第一二次输出
因为调用了t.m()
System.out.print(TestStatic.i+" ");

TestStatic.i=0
int i=18只是申明一个局部变量并对其初始化
不影响TestStatic.i的结果

System.out.print(ts.i+" ");
结果还是0,因为使用类名点取和类的对象点取
对于静态变量访问的是同一个内存地址

第三次输