关于方法前加 static 的精确定义

galimatoo 2008-09-23 11:58:50
请问一下,java中,把static说成“在编译时就确定的东西”是不是很准确?

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

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

以上只是我个人的一些观点,只是觉得自己说得还有几分道理,想让大家帮我找找碴,以便能改变自己的错误观念
...全文
338 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
PowerYangcl 2012-07-11
  • 打赏
  • 举报
回复
强势围观!
ZangXT 2008-09-23
  • 打赏
  • 举报
回复
在编译的时候确定,对于方法而言,还有一个意义就是早绑定的或者说是静态绑定的.区别于非static方法重写时带来的动态绑定.
paullbm 2008-09-23
  • 打赏
  • 举报
回复
加了static的就可以直接通过类名调用!!
rypgood 2008-09-23
  • 打赏
  • 举报
回复
我觉得把“在编译时就确定的东西”改成“在类初始化时就确定的东西”是不是会更准确一点?
理由如下:
1、类在初始化后各种static修饰的字段方法才有其物理内存,而没有用static修饰的方法则没有物理内存(也就是指还没有被确定下来)
2、我觉得在编译时就能被确定下来的东西应该是指:至少用final修饰的字段,且该字段应该为直接量,
这样在编译时其它类引用的这个字段就直接用直接量表示了


这个说法是错误的

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

2、你这里说的static final修饰的东西,只是一个特例,其实是否为final与static是无关的,你可以定义一个变量为
public final int a=10;这样你不创建实例是无法访问的,所以,即使是final的,如果不是static的,它就不能在编译时确定。
cydp007 2008-09-23
  • 打赏
  • 举报
回复
应该是 当class 被加载到 jvm时就确定的东西.

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

galimatoo 2008-09-23
  • 打赏
  • 举报
回复
呵呵,最近我是有点学院派了,只是最近没有项目,想猜猜sun最初想使用static到底是出于一种什么样的考虑,以便能够在以后的设计中更灵活地应用进去。

2楼的朋友:类的初始与对象的创建是没有直接关系的,简单点说如:类能在调用static方法时初始化(呵呵,我是学院派,有点顽固,不要见怪啊)
suifeng411 2008-09-23
  • 打赏
  • 举报
回复
发表下自己的看法
引用:我觉得把“在编译时就确定的东西”改成“在类初始化时就确定的东西”是不是会更准确一点?
静态的方法是不依赖于对象的,不是在类的初始时而确定,那样理解感觉是,静态的方法还是依赖于对象的创建而才能调用.
junshi_liu 2008-09-23
  • 打赏
  • 举报
回复
其实没有必要研究这么深,知道带 static的方法可以不是实例化类就可以调用就行了,实际开发中基本上没有必要去研究到底什么时候确定了什么东西。
感觉楼主有点学院派了
galimatoo 2008-09-23
  • 打赏
  • 举报
回复
呵呵,是我理解得不准确了

lizhanlang 2008-09-23
  • 打赏
  • 举报
回复
如果一个字段被定义成static则它就属于该类本身,
在编译时,类加载过程中系统就给他们分配好了内存空间(也就是该字段就定义了).
此后它就独占一块内存空间永远都不会改变(不会再因为给类创建对象而使它再另分配内存空间了).
所以在我们要调用static字段时我们直接就可以调用,而不用去创建类的对象就可以实现!!
excel_shen_2010 2008-09-23
  • 打赏
  • 举报
回复
同意5楼的观点
justinavril 2008-09-23
  • 打赏
  • 举报
回复
static is static...it's a little special...nothing more...if u can use it...
pauliuyou 2008-09-23
  • 打赏
  • 举报
回复
static就是静态的意思,和动态相对,而动态又是由new来体现的.可以理解为static的对象都在栈内,只有一份,而且效率很高.
但是动态的都在堆上,速度较慢,但不受栈大小的限制

所有的静态对象都是和.class的生存期一致. 而动态对象则是在new以后才产生
llddy 2008-09-23
  • 打赏
  • 举报
回复
顶上去,基础的东西是最让人 模灵凉可的。。
galimatoo 2008-09-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ZangXT 的回复:]
在编译的时候确定,对于方法而言,还有一个意义就是早绑定的或者说是静态绑定的.区别于非static方法重写时带来的动态绑定.
[/Quote]

确实,这里面我一点也不明白,呵呵,有待学习
galimatoo 2008-09-23
  • 打赏
  • 举报
回复
“类在初始化后各种static修饰的字段方法才有其物理内存”确实我写得不好

我本来想把字段的确定,与方法的确定统一地说成上面那样(因为字段是在初始化时赋值)

但这句:“即使是final的,如果不是static的,它就不能在编译时确定。”
public class Test {

final int i = 333;

void doit(){
System.out.println("the i =" + i);
}

}

返编译:
public Test();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: aload_0
5: sipush 333
8: putfield #2; //Field i:I
11: return

void doit();
Code:
0: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #4; //String the i =333 ********************我指的是这里确定下来了
5: invokevirtual #5; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return

}

当然,这里有个前提是我否认“static是在编译时就确定的东西”也就是我可能赞成“没有static修饰,也能在编译时被确定,只是还不能直接调用”
以及“类的初始化”是不同与“对象的初始化”的
wNvShine 2008-09-23
  • 打赏
  • 举报
回复
5楼正解```

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧