JAVA 静态变量与构造函数问题

adelaide_yong 2008-07-09 09:36:29
public class ValueTwo {
static int b=0;
public ValueTwo(int v){
b=v;
}
public void cumulate()
{
b++;
}
}
-----------------------


public class TestValueTwo {
private void prin(int a){
System.out.println(a);
}
ValueTwo vt=new ValueTwo(10);

public static void main(String args[]){
ValueTwo vt1=new ValueTwo(1);
TestValueTwo tt=new TestValueTwo();
tt.prin(vt1.b);
vt1.cumulate();
tt.prin(vt1.b);

}
}
问题是:不是打印出为什么打印出来是10,11而不是1,2呢?
明明根据ValueTwo vt1=new ValueTwo(1); 后b=1的。
...全文
351 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Asinzy 2009-02-13
  • 打赏
  • 举报
回复
就是这个语句作怪啊,你为什么要它啊?

ValueTwo vt=new ValueTwo(10);
//这里是作为TestValueTwo的一个成员变量了,但是你的b又是一个static的,所以b的值只有一份啊,结果肯定是10和11了
huangan0301 2009-02-12
  • 打赏
  • 举报
回复
的确是楼上说的那样,你在代码中加一句打印语句就知道了,再就是b是静态变量,他不是属于对象而是属于类。
public class ValueTwo {
static int b=0;
public ValueTwo(int v){
b=v;
}
public void cumulate()
{
b++;
}
}
-----------------------


public class TestValueTwo {
private void prin(int a){
System.out.println(a);
}
ValueTwo vt=new ValueTwo(10);

public static void main(String args[]){
ValueTwo vt1=new ValueTwo(1);
System.out.print(vt1.b);
TestValueTwo tt=new TestValueTwo();
tt.prin(vt1.b);
vt1.cumulate();
tt.prin(vt1.b);

}
}
leonxml 2009-02-10
  • 打赏
  • 举报
回复
我的理解是这样的:
ValueTwo vt1=new ValueTwo(1); // 这时b被赋值为1
TestValueTwo tt=new TestValueTwo(); // 构造TestValueTwo对象
// 初始化tt时构造了另一个ValueTwo对象,这时b被赋值为10
cantalou 2009-02-09
  • 打赏
  • 举报
回复
应该
有用啊
x_pengcheng 2008-11-10
  • 打赏
  • 举报
回复
static修饰的变量是一个类共享变量TestValueTwo类和ValueTwo类共享b变量


当ValueTwo vt1 = new ValueTwo(1)时 b = 1

当TestValueTwo tt = new TestValueTwo()是b=10

这两个b指向同一个地址。
所以打印出来是10、11。
若鱼1919 2008-11-10
  • 打赏
  • 举报
回复
ValueTwo vt1=new ValueTwo(1);
System.out.println("vt1.b="+vt1.b);//1
TestValueTwo tt=new TestValueTwo();
System.out.println("vt1.b="+vt1.b);//10
加上两个输出你就明白了。

因为在构造TestValueTwo tt的时候,会给里面的字段赋值,也就是执行:
ValueTwo vt=new ValueTwo(10);
也就是在此时,b的值被修改了。
duanjinhu 2008-11-08
  • 打赏
  • 举报
回复
kan kan
zhangpeng9886123 2008-11-07
  • 打赏
  • 举报
回复
我想问一下各们,程序中这句是什么时候执行
ValueTwo vt=new ValueTwo(10);
我怎么觉得没有用到这句呢 谢谢各位了
hejunPurple 2008-11-05
  • 打赏
  • 举报
回复
JAVA中的静态变量相当于C中的全局变量
所以对JAVA中静态变量的改变会存储起来知道下次调用运算
fighter999 2008-10-28
  • 打赏
  • 举报
回复
这很简单能明白啊,因为b是ValueTwo 静态成员变量
而静态成员变量的值是指向最后一次实例化的那个对象的值
所以是1和2,而不是10,11
ZangXT 2008-09-20
  • 打赏
  • 举报
回复
Main tt = new Main();
ValueTwo vt1 = new ValueTwo(1);
tt.prin(vt1.b);
vt1.cumulate();
tt.prin(vt1.b);
这样就是1,2了
不知道这个程序的目的是什么
vitamin_ease 2008-09-20
  • 打赏
  • 举报
回复
因为是先执行static void main,
即先执行ValueTwo vt1=new ValueTwo(1);
而在实例化TestValueTwo 时,
才执行ValueTwo vt=new ValueTwo(10); 这句,
此时,b被设置为10.
javapcpop 2008-09-20
  • 打赏
  • 举报
回复
我是这样想的
在第一个ValueTwo类中,定义了一个静态变量b,
静态变量在内存中是对于每个类是共享的状态
所以
当你定义一个vt时,将b赋值为10了
而后
又定义了新的一对像,当然就同样指向原来的值

50,523

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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