java中静态属性和静态方法的问题

在一个类中的静态属性声明并初始化赋值后,在一个静态方法中对这个属性值进行修改,那么在另一个类中,通过第一个类的类名访问这个静态属性的话,它的值是初始化的值,还是静态方法修改后的值呢?比如像下面的代码
class A{
public static int n=1;
public static void m(){
n=2;
}}
public class B{
public static void main(String[] args){
int a=A.n;
}}
那么a的值是1还是2呢?

肯定是2没问题
原因如下
这个与编译顺序有关,java编译的时候首先是处理静态属性,然后处理静态方法,然后处理静态块
因此首先你定义的n确实初始化为1了
但是由于你这边存在静态方法m修改了n,这个被编译了,因此n变成了2
最后买来方法中使用的时候n就是2了

然后就是为什么要先编译static属性和方法
这是因为这些属性和方法可以直接用类名访问,不需要创建对象,因此不先把他们编译的话就会出现在普通方法中使用static属性或者方法找不到的问题。
这下应该清楚了。追问

其实我也是疑问这些事,可是我跑了一下程序,只用类名访问属性的话,确实还是初始值,只有调用一次m方法以后,n的值才变成2.我觉得应该是在static块的话,才会首先编译吧。

追答

应该是编译了,但是不调用不执行

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-09-27
一般静态变量都是公用的、全局的,程序一启动就会在内存开辟一块空间,存放它们。
静态的不必实例化就能直接使用;
静态方法里不能对非静态的成员变量做操作。
一般静态方法操作静态成员变量或全局变量。
================搞清这些定义==================
A.n
类名.静态变量
你又没调用m()方法,就没有改变n的值
故而结果为1

本回答被提问者采纳
第2个回答  2013-10-28

当然是1,你又没有调用m()这个方法


你这样写

static{
    n=2;
}

结果是2,静态代码块每一次都是先执行

第3个回答  2013-10-28
静态属性一旦初始化并赋值之后就不可改变了,所以a的值应该是1.追问

静态属性应该能在静态方法中进行复制,只有加上final修饰以后才不可改变吧?

追答

可是你并没有跑静态方法呀!

追问

嗯,嗯,谢谢

相似回答