黑马程序员技术交流社区

标题: 知道答案不明白为什么。为什么输出结果是那样 ? [打印本页]

作者: 王健    时间: 2012-6-28 13:11
标题: 知道答案不明白为什么。为什么输出结果是那样 ?
本帖最后由 刘蕴学 于 2012-6-28 17:12 编辑

public class test
{
    static String color="绿色";
    public test(String color)
    {
         this.color+=color;
    }
    public static void main(String args[])
    {
        test t1 = new test("黄色");
        test t2 = new test("红色");
        System.out.println(t1.color);
        System.out.println(t2.color);
        System.out.println(color);
    }
}
结果: a=1,  koo.a=2, ary[0]=2
这是为啥??
作者: 常佳杰    时间: 2012-6-28 13:33
我运行的结果是:
绿色黄色红色
绿色黄色红色
绿色黄色红色


作者: 孙飞    时间: 2012-6-28 13:37
你类名没大写,我估计你在DOS命令里运行的都不是这个类
public class Test
{
    static String color="绿色";
    public Test(String color)
    {
         this.color+=color;
    }
    public static void main(String args[])
    {
        Test t1 = new Test("黄色");
        Test t2 = new Test("红色");
        System.out.println(t1.color);
        System.out.println(t2.color);
        System.out.println(color);
    }
}
运行结果为
绿色黄色红色
绿色黄色红色
绿色黄色红色
作者: 封明川    时间: 2012-6-28 13:49
没编译吧
是其他程序的.class文件吧
作者: 邵阳    时间: 2012-6-28 14:42
为啥运行结果是
绿色黄色红色
绿色黄色红色
绿色黄色红色
  详细过程
作者: 邵阳    时间: 2012-6-28 14:47
为啥结果是
绿色黄色红色
绿色黄色红色
绿色黄色红色

楼主帮忙解答


作者: 邵阳    时间: 2012-6-28 14:48
常佳杰 发表于 2012-6-28 13:33
我运行的结果是:
绿色黄色红色
绿色黄色红色

为啥是
绿色黄色红色
绿色黄色红色
绿色黄色红色
详解运行过程
作者: 常佳杰    时间: 2012-6-28 14:58
Test t1 = new Test("黄色");
这句话你应该明白吧..
所以绿色,黄色,红色都在堆中..
又因为
  public static void main(String args[])
    {
        Test t1 = new Test("黄色");
        Test t2 = new Test("红色");
        System.out.println(t1.color);
        System.out.println(t2.color);
        System.out.println(color);
    }
中是按顺序执行的,所以红色在黄色后边..
所以顺序就是绿色黄色红色

还有又因为 t1,t2都是Test的索引,按顺序执行完color里边的属性值为绿色黄色红色
所以t1.color()和t2.color()都是输出Test的属性值..为:绿色黄色红色

最后 System.out.println(color);也就是输出它的属性值,也是绿色黄色红色
作者: 李文龙    时间: 2012-6-28 15:40
public class Test
{
    static String color="绿色";
    public Test(String color)
    {
         this.color+=color;
    }
    public static void main(String args[])
    {
        Test t1 = new Test("黄色");
        Test t2 = new Test("红色");
        System.out.println(t1.color);
        System.out.println(t2.color);
        System.out.println(color);
    }
}
运行结果为
绿色黄色红色
绿色黄色红色
绿色黄色红色
首先你看程序里面 static String color="绿色"; 初始化为 绿色,当程序运行到 Test t1 = new Test("黄色"); 的时候,构造函数里面是这句话 this.color+=color;  也就是  this.color= this.color+color;    所以 this.color="绿色"+"黄色",  再接着执行这句Test t2 = new Test("红色"); 同样调用构造函数  this.color="绿色黄色"+"红色"  ,这样之后,静态常量 color 的值就变成了 绿色黄色红色 ,下边的打印输出也就是这个值了
作者: 邵阳    时间: 2012-6-28 15:56
常佳杰 发表于 2012-6-28 14:58
Test t1 = new Test("黄色");
这句话你应该明白吧..
所以绿色,黄色,红色都在堆中..

Test t1 = new Test("黄色");
不是只有类才可以吗
作者: 游洪波    时间: 2012-6-28 16:29
运行结果为
绿色黄色红色
绿色黄色红色
绿色黄色红色
这个是我的运行结果,至于你出现的那种结果,我估计你在用java命令的时候后边是不是写错了类名啊,你输出的结果和你的程序是没有任何关联的啊。
至于那个“邵阳”刚才问问什么结果会是这样的我给你说下,如果你把color前边的static去掉以后结果就会不一样的,正是因为color是静态的所以,在执行Test t1 = new Test("黄色");
color="绿色黄色",然后又执行 Test t2 = new Test("红色");color=“绿色黄色红色” 而t1和t2引用的都是static的color所以输出的结果就会成:
绿色黄色红色
绿色黄色红色
绿色黄色红色
之所以导致这样的原因就是应为一个static
作者: 邵阳    时间: 2012-6-28 18:13
李文龙 发表于 2012-6-28 15:40
public class Test
{
    static String color="绿色";

能不能说一下详细的过程,为啥打印的属性值,还有就是那个打印的color到底带代表什么。



希望快点回复,谢谢。

作者: 吴琼    时间: 2012-6-28 18:25
public class test
{
    static String color="绿色";//由于这里的变量color是静态的.他的值一旦改变.全局也会跟着改变.
                                              老师举了个简单例子.如果赵本山移民加拿大,小沈阳也拥有这个变量的话小沈阳也跟着去加拿大了.呵呵
    public test(String color)
    {
         this.color+=color;//这里都看的懂.color本来是绿色的.可以看成this.lolor=绿色+本身的color;
    }
    public static void main(String args[])
    {
        test t1 = new test("黄色");//这里通过构造初始化.可以看成this.color = 绿色+黄色.此时定义的color变量不在是以前的绿色了而是绿色黄色
        test t2 = new test("红色");//这里也是一样改变后的值 就相当于你开始定义color=''绿色黄色红色''了
        System.out.println(t1.color);//这里打印color的值就是改变后的color了
        System.out.println(t2.color);
        System.out.println(color);
//三条打印语句都是一样的.静态的变量是全类共享的数据所以打印的结果就为
绿色黄色红色
绿色黄色红色
绿色黄色红色
希望你能看明白...
    }
}

作者: 吴小东    时间: 2012-6-28 18:51
本帖最后由 吴小东 于 2012-6-28 18:55 编辑

楼上已经说的很清楚了,这个结果主要是反应了静态变量的概念,当class文件一加载
static String color="绿色";//这一句是在方法区里面就产生了一个 color的变量 值为 绿色
然后主函数中创建了两个test的对象
test t1 = new test("黄色");//创建对象的同时,调用构造函数 color的值就跟着变成 绿色黄色,而且是static 修饰想 所以每次改变之后的值依然是存放在方法区中
test t2 = new test("红色");//这一句同样也调用了构造函数 color的值就变为了 绿色黄色红色

不管你创建多少个对象,都是对同一个数据源 color 在操作, 并不会因为新创建一个对象就新创建一个对象.color
静态变量的创建实际上是在为该类创建共享数据,就像毕老师讲到的卖票系统 static number =100; 不管你创建几个窗口(也即是几个对象)卖票 你操作的数据都是同一个number
作者: 李文龙    时间: 2012-6-28 19:26
邵阳 发表于 2012-6-28 18:13
能不能说一下详细的过程,为啥打印的属性值,还有就是那个打印的color到底带代表什么。

因为  color 是静态数据成员,为所有对象共享,所以 t1.color 、t2.color、color 实质上都是指的同一个,上面我已经解释了为什么 color 的值变为了 绿色黄色红色 ,我猜你是不知道静态数据的变化吧,它的值不像局部变量,局部变量退出方法后就被清空了,静态数据的值得程序退出运行才会清空。
color 在这个程序中就是代表一下颜色而已,你完全可以把它当做 abcd,只是这样有明确意思的读起来清晰易懂
作者: 邵阳    时间: 2012-6-28 20:12
李文龙 发表于 2012-6-28 19:26
因为  color 是静态数据成员,为所有对象共享,所以 t1.color 、t2.color、color 实质上都是指的同一个, ...

哥们能不能把这个运行过程化一次啊图,像那个数引用哪个地址等
作者: 李文龙    时间: 2012-6-28 20:52
邵阳 发表于 2012-6-28 20:12
哥们能不能把这个运行过程化一次啊图,像那个数引用哪个地址等

:L这个画图,有点不好搞额,图是蛮抽象的,静态成员为类对象所共享,它们都是指向同一片内存区间的,即便图画给你看了,你还是需要对照着上面的解释说明,才能知道为嘛




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2