java:不能对非静态字段 rand 进行静态引用

package com.lzw;
import java.util.Random;

public class FinalStaticData {
//问题在这行,说这里要加static Random rand=new Random();
final int a=rand.nextInt(10);
static final int b=rand.nextInt(10);

public static void main(String args[]){
FinalStaticData c=new FinalStaticData();
System.out.println(c.a);
System.out.println(c.b);

FinalStaticData d=new FinalStaticData();
System.out.println(d.a);
System.out.println(d.b);
}

}
求解

静态方法不能访问非静态成员(包括静态方法和静态变量),但非静态方法可以静态成员和非静态成员。
方法或变量加上static声明就被定义为静态成员。
静态成员属于类所有,被类的所有对象共享,它在程序预编译期间就能确定。非静态成员属于对象所有,而对象需要在程序运行期间分配空间。故在预编译期间就能确定的静态成员不能访问需要在程序运行时才能确定的非静态成员。
针对你的问题,main是静态方法,它只能访问静态成员,所以它可以访问static的b,不能访问没有static声明的rand,解决方法就是在成员声明前加static关键字,表明该成员是静态成员。追问

那主方法为什么可以访问变量a呢

追答

final声明的变量即为常量,常量也是在预编译期间分配存储空间的,静态成员也可以访问。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-02-24
.改成这样看看
public class FinalStaticData {
//问题在这行,说这里要加static Random rand;
final int a=rand.nextInt(10);
static final int b=rand.nextInt(10);
FinalStaticDate()
{
rand==new Random();
}
public static void main(String args[]){
FinalStaticData c=new FinalStaticData();
System.out.println(c.a);
System.out.println(c.b);

FinalStaticData d=new FinalStaticData();
System.out.println(d.a);
System.out.println(d.b);
}

}
相似回答