java静态变量问题

xiangshan1234 2014-02-20 11:54:03
我定义了两个类
package Test;
public class First {
public static void main(String[] args) {
Second second = new Second();
Second.a = "a";
Second.b = "b";
System.out.println("a:"+Second.a);
System.out.println("b:"+Second.b);
}
}


package Test;
public class Second {
public static String a;
public static String b;
public static void main(String[] args) {
System.out.println("a:"+a);
System.out.println("b:"+b);
}
}


我先执行了First类,输出结果是
a:a
b:b

再执行Second类,输出结果是:
a:null
b:null

刚接触java,看书上说静态变量在类加载的时候就在内存里分配了空间,我执行完First.java后,已经给静态变量赋值了,为何在Second.java中输出为null
...全文
465 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
oarsman 2014-02-21
  • 打赏
  • 举报
回复
2楼是正确的,你两次运行main函数,实际是启动了2个虚拟机,里面的ab不会重用的。你应该在一次执行完成上面的操作
代码间的舞者 2014-02-21
  • 打赏
  • 举报
回复
引用 20 楼 houshen13828468384 的回复:
有错别字纠正下: 看这2段代码,我认为2楼的说法有问题,应该是起来两个虚拟机环境,两个不同虚拟机进程(环境)是不能通过虚拟机内存互相取值的,除非做了些其他操作,比如session复制过程(但我认为即使是复制也是通过网络手段互传信息,起到初始复制作用的)。你运行两个main的时候其实有两个javaw.exe
20楼市正确的。确实是两个javaw.exe
爱的人是你 2014-02-21
  • 打赏
  • 举报
回复
静态的变量只能实例化一次,并且是 类名.属性名 如果是new的化无法对类的变量惊醒实例, 他获得时新的对象,所以在first中得到的是新结果,这个结果只针对这个对象,没有对secod进行实例。 secod的实例类名.属性名
houshen13828468384 2014-02-21
  • 打赏
  • 举报
回复
有错别字纠正下: 看这2段代码,我认为2楼的说法有问题,应该是起来两个虚拟机环境,两个不同虚拟机进程(环境)是不能通过虚拟机内存互相取值的,除非做了些其他操作,比如session复制过程(但我认为即使是复制也是通过网络手段互传信息,起到初始复制作用的)。你运行两个main的时候其实有两个javaw.exe
houshen13828468384 2014-02-21
  • 打赏
  • 举报
回复
package com.hou.tomain; public class Main { public static void main(String args[]) throws InterruptedException { Second s =Second.getSecond(); s.setA(2); s.setB(4); System.out.println(s.getA()); System.out.println(s.getB()); for(;;){ Thread.sleep(10000); System.out.println(s.getA()); System.out.println(s.getB()); } } } package com.hou.tomain; public class Second { private int a = 0; private int b = 0; private Second() { } public static Second second = new Second(); public static Second getSecond() { return second; } public static void main(String args[]) { System.out.println(second.getA()); System.out.println(second.getB()); } public int getA() { return a; } public void setA(int a) { this.a = a; } public int getB() { return b; } public void setB(int b) { this.b = b; } } 看这2段代码,我认为2楼得说法有问题,我认为的是想当与起来两个虚拟机环境,不互通的两个虚拟机进程是不能通过虚拟机内存互相取值的。你运行两个main的时候其实有两个javaw.exe
灰太狼A代 2014-02-21
  • 打赏
  • 举报
回复
引用 2 楼 duxingzhe0311 的回复:
执行完First之后,java虚拟机就死了,再执行Second的时候原来赋的值就木有了。
正解
平菇虾饺 2014-02-21
  • 打赏
  • 举报
回复
First执行结束,虚拟机清理内存,a,b不在了
lingeweibu 2014-02-21
  • 打赏
  • 举报
回复
2楼、11正解
TKD03072010 2014-02-21
  • 打赏
  • 举报
回复
First.java 执行完 该JVM实例的生命周期已结束 再执行Second.java时 已是另一个JVM实例 二者互不影响 所以 LZ 执行完 First.java 再执行Second.java 的结果就是这样的
ctgucool 2014-02-21
  • 打赏
  • 举报
回复
两个main方法,这是两个进程,两个进程之间是不会有任何关系的。 静态变量的前提,是同一个进程的
rockets311 2014-02-20
  • 打赏
  • 举报
回复
执行完First之后,java虚拟机就死了,再执行Second的时候原来赋的值就木有了。
长笛党希望 2014-02-20
  • 打赏
  • 举报
回复
Second.java文件中的变量a、b就重新定义赋值了,,,只是为空而已,所以打印输出为null。
haha_321 2014-02-20
  • 打赏
  • 举报
回复
貌似两个类没什么关系。。。
代码间的舞者 2014-02-20
  • 打赏
  • 举报
回复
引用 楼主 xiangshan1234 的回复:
我定义了两个类 package Test; public class First { public static void main(String[] args) { Second second = new Second(); Second.a = "a"; Second.b = "b"; System.out.println("a:"+Second.a); System.out.println("b:"+Second.b); } } package Test; public class Second { public static String a; public static String b; public static void main(String[] args) { System.out.println("a:"+a); System.out.println("b:"+b); } } 我先执行了First类,输出结果是 a:a b:b 再执行Second类,输出结果是: a:null b:null 刚接触java,看书上说静态变量在类加载的时候就在内存里分配了空间,我执行完First.java后,已经给静态变量赋值了,为何在Second.java中输出为null
执行完First.java后,内存就回收了,所以不会保留a、b的值了 楼主看书的话,应该可以看到java有内存自动回收功能。
romance_jay 2014-02-20
  • 打赏
  • 举报
回复
自古二楼出大神
chchsheng 2014-02-20
  • 打赏
  • 举报
回复
顶2楼,突然觉得lz的问题好奇葩
努力吧少年 2014-02-20
  • 打赏
  • 举报
回复
支持2楼,第一个main执行完后,生存期都结束了,再执行第2个,跟第一个设置的没什么关系了
student-ai 2014-02-20
  • 打赏
  • 举报
回复
改了一下,可以了.


/**
 * 
 * @author pu_ruidong
 *
 */
public class Test {
public static void main(String[] args) {
	//TestA second = new TestA();
	System.out.println("a:"+TestA.a);
	System.out.println("b:"+TestA.b);
	System.out.println("**************************************************");
	TestA.a = "a";
	TestA.b = "b";
	System.out.println("a:"+TestA.a);//这个地方获取的就是TestA类里面的值.
	System.out.println("b:"+TestA.b);//同上.
}
}
另外一个类:


/**
 * 
 * @author pu_ruidong
 *
 */

public class TestA {
	
	public static String a="1";
	public static String b="2";
	

}

student-ai 2014-02-20
  • 打赏
  • 举报
回复
貌似不能一次执行两个main()方法的.
  • 打赏
  • 举报
回复
你玩游戏,为什么可以双开?想想!
加载更多回复(2)

62,621

社区成员

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

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