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

关于方法前加 static 的精确定义
请问一下,java中,把static说成“在编译时就确定的东西”是不是很准确?

因为我觉得这个说法没多大实际意义,首先,不知道static到底确定了什么,是方法字段的存在性,还是不变性?
其次,不用static修饰的方法字段难道就没有被“确定”下来?

我觉得把“在编译时就确定的东西”改成“在类初始化时就确定的东西”是不是会更准确一点?
理由如下:
  1、类在初始化后各种static修饰的字段方法才有其物理内存,而没有用static修饰的方法则没有物理内存(也就是指还没有被确定下来)
  2、我觉得在编译时就能被确定下来的东西应该是指:至少用final修饰的字段,且该字段应该为直接量,
  这样在编译时其它类引用的这个字段就直接用直接量表示了

以上只是我个人的一些观点,只是觉得自己说得还有几分道理,想让大家帮我找找碴,以便能改变自己的错误观念

------解决方案--------------------
其实没有必要研究这么深,知道带 static的方法可以不是实例化类就可以调用就行了,实际开发中基本上没有必要去研究到底什么时候确定了什么东西。
感觉楼主有点学院派了
------解决方案--------------------
发表下自己的看法
引用:我觉得把“在编译时就确定的东西”改成“在类初始化时就确定的东西”是不是会更准确一点? 
静态的方法是不依赖于对象的,不是在类的初始时而确定,那样理解感觉是,静态的方法还是依赖于对象的创建而才能调用.

------解决方案--------------------
应该是 当class 被加载到 jvm时就确定的东西.

并不是 new 出对象时.. static 显示出与 对象的无关性.


------解决方案--------------------
我觉得把“在编译时就确定的东西”改成“在类初始化时就确定的东西”是不是会更准确一点? 
理由如下: 
1、类在初始化后各种static修饰的字段方法才有其物理内存,而没有用static修饰的方法则没有物理内存(也就是指还没有被确定下来) 
2、我觉得在编译时就能被确定下来的东西应该是指:至少用final修饰的字段,且该字段应该为直接量, 
这样在编译时其它类引用的这个字段就直接用直接量表示了 


这个说法是错误的

首先,statc方法是在类初始化前,类装载的时候就已经确定的,也可以说,是在编译时(或者说编译后)确定的
你还记得不记得String.valueOf这个方法?这里我们并没有给出一个String实例,也就不存在初始化一说,但是我们确实用到了这个方法。

2、你这里说的static final修饰的东西,只是一个特例,其实是否为final与static是无关的,你可以定义一个变量为
public final int a=10;这样你不创建实例是无法访问的,所以,即使是final的,如果不是static的,它就不能在编译时确定。
------解决方案--------------------
加了static的就可以直接通过类名调用!!
------解决方案--------------------
在编译的时候确定,对于方法而言,还有一个意义就是早绑定的或者说是静态绑定的.区别于非static方法重写时带来的动态绑定.
------解决方案--------------------
5楼正解```
------解决方案--------------------
顶上去,基础的东西是最让人 模灵凉可的。。
------解决方案--------------------
static就是静态的意思,和动态相对,而动态又是由new来体现的.可以理解为static的对象都在栈内,只有一份,而且效率很高.
但是动态的都在堆上,速度较慢,但不受栈大小的限制

所有的静态对象都是和.class的生存期一致. 而动态对象则是在new以后才产生
------解决方案--------------------
static is static...it's a little special...nothing more...if u can use it...
------解决方案--------------------
同意5楼的观点
------解决方案--------------------
如果一个字段被定义成static则它就属于该类本身,
在编译时,类加载过程中系统就给他们分配好了内存空间(也就是该字段就定义了).
此后它就独占一块内存空间永远都不会改变(不会再因为给类创建对象而使它再另分配内存空间了).
所以在我们要调用static字段时我们直接就可以调用,而不用去创建类的对象就可以实现!!