A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 刘蕴学 于 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
这是为啥??

16 个回复

倒序浏览
我运行的结果是:
绿色黄色红色
绿色黄色红色
绿色黄色红色

回复 使用道具 举报
你类名没大写,我估计你在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);
    }
}
运行结果为
绿色黄色红色
绿色黄色红色
绿色黄色红色
回复 使用道具 举报
没编译吧
是其他程序的.class文件吧
回复 使用道具 举报
为啥运行结果是
绿色黄色红色
绿色黄色红色
绿色黄色红色
  详细过程
回复 使用道具 举报
为啥结果是
绿色黄色红色
绿色黄色红色
绿色黄色红色

楼主帮忙解答

回复 使用道具 举报
邵阳 中级黑马 2012-6-28 14:48:17
7#
常佳杰 发表于 2012-6-28 13:33
我运行的结果是:
绿色黄色红色
绿色黄色红色

为啥是
绿色黄色红色
绿色黄色红色
绿色黄色红色
详解运行过程
回复 使用道具 举报
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);也就是输出它的属性值,也是绿色黄色红色

评分

参与人数 1技术分 +1 收起 理由
刘蕴学 + 1 t1 和 t2叫引用不叫索引

查看全部评分

回复 使用道具 举报
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 的值就变成了 绿色黄色红色 ,下边的打印输出也就是这个值了

评分

参与人数 1技术分 +2 收起 理由
刘蕴学 + 2 赞一个!

查看全部评分

回复 使用道具 举报
常佳杰 发表于 2012-6-28 14:58
Test t1 = new Test("黄色");
这句话你应该明白吧..
所以绿色,黄色,红色都在堆中..

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

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



希望快点回复,谢谢。
回复 使用道具 举报
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);
//三条打印语句都是一样的.静态的变量是全类共享的数据所以打印的结果就为
绿色黄色红色
绿色黄色红色
绿色黄色红色
希望你能看明白...
    }
}

评分

参与人数 1技术分 +1 收起 理由
刘蕴学 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 吴小东 于 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

评分

参与人数 1技术分 +1 收起 理由
刘蕴学 + 1

查看全部评分

回复 使用道具 举报
邵阳 发表于 2012-6-28 18:13
能不能说一下详细的过程,为啥打印的属性值,还有就是那个打印的color到底带代表什么。

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

评分

参与人数 1技术分 +1 收起 理由
刘蕴学 + 1

查看全部评分

回复 使用道具 举报
李文龙 发表于 2012-6-28 19:26
因为  color 是静态数据成员,为所有对象共享,所以 t1.color 、t2.color、color 实质上都是指的同一个, ...

哥们能不能把这个运行过程化一次啊图,像那个数引用哪个地址等
回复 使用道具 举报
邵阳 发表于 2012-6-28 20:12
哥们能不能把这个运行过程化一次啊图,像那个数引用哪个地址等

:L这个画图,有点不好搞额,图是蛮抽象的,静态成员为类对象所共享,它们都是指向同一片内存区间的,即便图画给你看了,你还是需要对照着上面的解释说明,才能知道为嘛
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马