Topic: final与static变量的区别是什么?

  Print this page

1.final与static变量的区别是什么? Copy to clipboard
Posted by: SY_Gemini
Posted on: 2005-11-19 10:33

final定义的变量对每个对象都存在,而static变量是多个对象共用,对吗?

2.Re:final与static变量的区别是什么? [Re: SY_Gemini] Copy to clipboard
Posted by: Jcat
Posted on: 2005-11-19 11:41

final定义的变量其实是个常量(用一个有意义的名字来表示一个常量,就像C里面的预处理一样,当然比后者更完善)。
经常的,final 与static 连用来表示一个常量

在装载一个类的时候,static变量即被分配一块内存;
创建自该类的实例们共用该变量。

3.Re:final与static变量的区别是什么? [Re: Jcat] Copy to clipboard
Posted by: SY_Gemini
Posted on: 2005-11-19 13:16

那final 定义的不带static 的常量是不论这个类创建多少个对象都只有一个吗?

4.Re:final与static变量的区别是什么? [Re: Jcat] Copy to clipboard
Posted by: Infinite
Posted on: 2005-11-20 02:11

小小补充一点:并不是创建了该类的实例化对象才能使用该类的静态成员变量或静态方法,他们都可以直接通过该类来调用:[类名].[静态成员变量]
================================================
Jcat wrote:
final定义的变量其实是个常量(用一个有意义的名字来表示一个常量,就像C里面的预处理一样,当然比后者更完善)。
经常的,final 与static 连用来表示一个常量

在装载一个类的时候,static变量即被分配一块内存;
创建自该类的实例们共用该变量。

5.Re:final与static变量的区别是什么? [Re: SY_Gemini] Copy to clipboard
Posted by: Jcat
Posted on: 2005-11-20 14:45

SY_Gemini wrote:
那final 定义的不带static 的常量是不论这个类创建多少个对象都只有一个吗?


不是,如 final int a=0;,每建一个实例,就为a分配一块内存,且等于0。
但这样似乎有点浪费,所以一般与static连用(这句话是我瞎说的,书上没看到过这种说法,如果这样定义有别的意义,请指正)

6.Re:final与static变量的区别是什么? [Re: Jcat] Copy to clipboard
Posted by: SY_Gemini
Posted on: 2005-11-20 15:03

Infinite补充的是对的,static类型的方法或变量是和类一起装载的,是先于对象的产生

7.Re:final与static变量的区别是什么? [Re: SY_Gemini] Copy to clipboard
Posted by: Jcat
Posted on: 2005-11-20 15:40

to SY_Gemini & Infinite:

你们似乎是认为“在装载一个类的时候,static变量即被分配一块内存”这句话不对,所以帮我补充、纠正?

首先,谢谢!你们的说法都没有错Smile

其次,你们似乎认为“装载一个类”就是“创建一个该类的实例”。如果是这样,我想纠正一下 “装载一个类” ≠ “创建一个该类的实例”。

请看下面的代码
public class T {
static int a = 1; //装载一个类时即被执行
static {
System.out.println(T.a); //装载一个类时即被执行
}

public static void main(String args[]) { //这里并没有创建T的实例
}
}
//结果输出:1

8.Re:final与static变量的区别是什么? [Re: SY_Gemini] Copy to clipboard
Posted by: Infinite
Posted on: 2005-11-20 16:35

Re:Jcat:
首先,感谢Jcat和SY_Gemini一起参与讨论。
我赞成Jcat的观点,所以我不是在纠正,而是在补充。
我想补充说明的是:对于该类所创建的对象,静态变量只有一个副本,因此,如果一个对象中的静态变量的值改变了,则所有用到该静态变量的地方值都改变了。所以,静态变量并不属于任何对象。即使没有创建对象,也能通过类名来调用。对于静态方法,他们可以通过类名来调用,而不必实例化类的一个对象来调用静态方法。( : p 就是说想说得更清楚了,请不要见怪〉
另外:实例化类要通过new操作符,所以当然不是“装载一个类”就是“创建一个该类的实例”。
呵呵~~再次感谢大家的讨论,感觉这样真的很好。

9.Re:final与static变量的区别是什么? [Re: Jcat] Copy to clipboard
Posted by: SY_Gemini
Posted on: 2005-11-21 12:55

恩,大家都这么热情,感觉太好了


   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923