java中的final修饰符怎么用?

public class TestAccount{
public static void main(String[] args){
Account c1=new Account();
Account c2=new Account();
System.out.println(c1.id);
System.out.println(c2.id);
}
}
class Account{
static long sid=100000L;
final long id;

public Account(){
    sid++;
    id=sid;
}

}

请问:final修饰的id不是不能改变值吗?为什么可以在account中改变?
id是全局变量吗?出现在account中的应该是局部变量吧

static和final并不是一定要一起用的,static修饰成员变量是指只在类加载的时候编译一次,将其存放在静态区域,在以后的调用中不用再重新加载,
eg:
public class A {

    public static int x = 5;

    public void add() {
      x ++;
    }
public static void main(String[] args) {
    A a = new A();
    a.add();
    System.out.println(a.x);
    A b = new A();
    System.out.println(b.x);
}

}
6
6

而final就是一个编译期常量,他只能要求一次复制,不允许二次赋值,这就在一定程度上保证了程序的安全性;

还有一个需要说明的是,构造方法虽然没有声明,但他默认的是static方法,故也只在类加载的时候加载一次,因此你的这个类
class Account{
static long sid=100000L;
final long id;

public Account(){
sid++;
id=sid;
}
}
在类加载的时候只是加载了
static long sid=100000L; 和构造方法,由于是静态的,所以每次new Account的时候,sid的值改变同时id的值也改变,若修改为
class Account{
static long sid=100000L;
final long id;

[color=red]public void Account(){
sid++;
id=sid;
} [/color]
}
则会报错。

以上是我个人的理解,希望和大家一起进步

[color=blue][b]final成员变量表示常量,只能被赋值一次,赋值后值不再改变。

id是 Account的类变量。java中没有全局变量的概念吧?

[/b][/color]

[color=blue][b]
static的属性,该类的多个实例,是共享的!

final的属性。如果不被static修饰,只是一个实例变量(纠正上次的回答)。

static修饰的是 类变量。

[/b]
[/color]
[code="java"]public class TestAccount {
public static void main(String[] args) {
// Account.class中的sid值为100000L
Account c1 = new Account();
// c1实例化后sid值100001L
// c1的final的id值为100001L
// Account.class中的sid值为100001L
Account c2 = new Account();
// c2实例化后sid值为100002L
// c2的final的id值为100002L
// Account.class中的sid值为100002L
System.out.println(c1.id);
System.out.println(c2.id);
}
}[/code]

[quote]请问:final修饰的id不是不能改变值吗?为什么可以在account中改变?
id是全局变量吗?出现在account中的应该是局部变量吧[/quote]

你的问题中final用来修饰一个变量:

1 final如果修饰一个基本类型变量,那么变量赋值后就不能修改了
在你的例子中,id是在构造函数中初始化的,初始化后如果不修改变量的值,就没有问题,如果修改了,就会报错。

2 final如果修改一个类,就表示对指向类的引用不能再指向其它类,例如:
[code="java"] final String str = "one";
str = "two";[/code]
就会报错。

另外,final的特性和全局和局部变量无关。

[size=large][color=red]请问:final修饰的id不是不能改变值吗?为什么可以在account中改变?
id是全局变量吗?出现在account中的应该是局部变量吧[/color][/size]

首先,你要明白类里的变名,加static的,就是类的变量,也就是无论你创建多少个类的对象,你都只有一个static类型的变量...也就是这个变量是类对象.....所有对象所有.

其次,final修饰的变量,在第一次设置值后,就不能再设置值了..

下面这个程序,就是错误的.
[code="java"]
package com.Test;
public class TestAccount {
public static void main(String[] args) {
Account c1 = new Account();
Account c2 = new Account();
System.out.println(c1.id);
System.out.println(c2.id);
}
}

class Account {
static long sid = 100000L;
final long id=100;

public Account() {
    sid++;
    id = sid;
}

}[/code]

希望对你有帮助...