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

static和final的问题哦,高手来看看啊
以下两个类
public   class   Foo2
{
int   x;
public   static   void   go()
{
System.out.println(x);
}
}
public   class   Foo6
{
int   x=12;
public   static   void   go(final   int   x)
{
System.out.println(x);
}
}
为什么Foo2编译不通过,而Foo6编译通过啊?
(书上说静态方法不能调用实例变量啊~~)

------解决方案--------------------
因为Foo6用的是函数参数的x,foo2用的是类的x,由于这个x不是static的。所以static的函数不能调用它。
就算把
public static void go(final int x)
{
System.out.println(x);
}
改为
public static void go(int x)
{
System.out.println(x);
}
也可以通过。
------解决方案--------------------
我们先来看 Foo2
很明显这里静态方法不能调用非静态的类实例变量x 。你可以这么想,这个x只有在 Foo2 被 new 出一个实例对象的时候才被初始化;而这个静态方法是脱离于类实例的,也就是说在 new 之前,这个方法就可以被调用。

再来看 Foo6
首先要明白 System.out.println(x); 这里的 x 是在参数列表里声明的 x ,而不是外边的类实例变量。理解这个了,为什么可以通过编译就很容易理解了。在方法里面调用本方法定义的变量,当然是可行的。这个 final 只不过是说,在这个方法里面,传入参数 x 的值不能被改变而已。