关于static和final的提问

来源:百度知道 编辑:UC知道 时间:2024/06/17 20:38:59
public class Test0
{
private static final String string;
public Test0(String str)
{
string=str;
System.out.println(string);
}

public static void main(String[] args)
{
Test0 t=new Test0("hello world");
Test0 tt=new Test0("world hello");
}

}
请问这段代码为什么构造方法里的string会报错,而去掉string定义时的static和final中的任何一个都可以通过?static和final为什么不能同时存在?还请指点

private static final String string;
final的意思是这个string不能再被改变。
static的意思是这个string在类被加载的时候就加载了。

private static String string;
如果是这样,sting再类加载的时候加载了,仍然可以,给string赋值。
private final String string;
string=null。(如果private final String string=“aa”;不是null那么string=str也是错的)
这里string的引用是不可以改变的,null是可以改变的,如string=str;而t.string="haha";这个就不行。

你可以看一下final的解释,有很多不错的解释。我解释的不好,
final String string=“final”;
是开辟了2个内存空间,在栈中的string引用在堆中的final,其中string是始终指向堆中的final这个地址的引用,不能改变。但是堆中的final却可以改变。

static final用来修饰成员变量,表示一旦给值就不可修改,并且通过类名可以访问。

1.首先正确的认识一下final, 一个final修饰的叫"终态", 而这种终态很特殊, 它指的是:"当这个变量被赋值之后成为终态". 那么,当一个被赋值之后的final修饰变量, 将不可再被赋新值. (先理解)

2.而static表示静态变量, 说穿了,你需要知道JAVA如何为一个类创建内存空间--我们知道类有空间,类产生的实例(对象)有空间,方法有空间,变量有空间, 当static修饰时, 这个变量会在类分配内存时就被分配内存了, 所以你知道,你可以不用产生对象就使用静态变量.

3.好了,有了以上两点,我们来看看, 你可以根据我的叙述试试. 首先,你只使用final修饰你的string, 你会发现不会报错, 因为这是一个"还没有被赋值的非静态的终态变量(在类分配内存时不会分配内存)