免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234
最近访问板块 发新帖
楼主: cnflybird
打印 上一主题 下一主题

老题从谈 ---再次让我迷惑 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2007-02-11 12:42 |只看该作者
补充一下:
      我很喜欢和“艾斯尼勒”兄弟讨论,这并不是激动

论坛徽章:
0
32 [报告]
发表于 2007-02-11 13:54 |只看该作者
其实这场争论早就结束了,只是有个人还没有看明白罢了

1。对String的工作机制,的确是我猜错了
2。艾斯尼勒说的传递值和我说的传递地址,后来发现是一个东西,即对对象的一个引用的表示数据,只是开始我觉得传递值(按C的理解习惯,绝对是一个数值),难以理解

论坛徽章:
0
33 [报告]
发表于 2007-02-12 09:41 |只看该作者
原帖由 upstorm 于 2007-2-11 13:54 发表
其实这场争论早就结束了,只是有个人还没有看明白罢了

1。对String的工作机制,的确是我猜错了
2。艾斯尼勒说的传递值和我说的传递地址,后来发现是一个东西,即对对象的一个引用的表示数据,只是开始我觉得传 ...

你喜欢和人讨论,并且讨论中也不断思考,这很好,本版欢迎这样的气氛,但是讨论中不要妄下断言,动不动就叫人反省,你自己怎么不反省?人家说的一定是错的吗?

把类分为“可变类”和“不可变类”只不过是一种区分方法,还可以有其他的分法,你愿意把它称为特殊类是你的自由,但是你为什么一定要说别人的话是错的呢?人可以分成胖子瘦子或者高的矮的,你坚持说这个人是胖子但为什么不接受别人说他是矮子呢?

论坛徽章:
0
34 [报告]
发表于 2007-02-14 19:27 |只看该作者
晕。。。。事情似乎超出了我控制的范围,本来只是想达到被解惑的目的,结果差点引发了一场“血案”
最开始比较迷惑,后来反复看了perryhg 的老帖,逐渐清晰起来,也有了自己的理解
可大家一讨论,更加深入了,却又让我有些迷惑了。。
于是,我又不得不回到教条主义上来了:
JAVA 作为一种高级程序设计语言的一个思想是:让程序员忽略低层实现,能简单、明了的使用之
所以,遵从这一原则,我们只需要知道 JAVA传参就是传值,就是一个COPY,与原型内容一样而已,不需刻意去追求事实的真理,就象 鸡与蛋 的关系,我们只需要知道鸡生蛋,蛋孵鸡就行了。谁管他先有鸡还是先有蛋。

by the way:大家的热情超呼了我的想象,我才注册没好久,最初是看了精华里的帖子才发现有这么块宝地,谢谢你们热情的参与讨论

论坛徽章:
0
35 [报告]
发表于 2007-02-14 23:14 |只看该作者
冒个泡:
我是初学者,对大家的高谈阔论粗略的看了下!我只提下个人的小小看法!
分析楼主提供的这个程序的内存运行情况就OK了!
分析前搞清楚下面一些定义,然后找个画图工具画画就OK了!
1、变量:
     按被声明的位置划分:成员变量和局部变量
     按所属的数据类型划分:基本数据类型变量和引用数据类型变量
2、内存四大块:
     heap:堆内存---所有new 出来的东西都在这里
     stack:栈内存---局部变量
     data segment :静态变量和字符串常量会存储在这里
     code segment: 代码段存放在这里
3、stack 内的局部变量在程序段运行结束后,就会消失;heap内的对象没有被任何引用指向它的时候会被垃
     圾回收机制处理!
补充:
1、分析楼主的题目:
package think;

public class Think_1 {
   
    public Think_1(int i) {
    }

    public static void change(String str)
    {
        str ="new";
    }

    public static void main(String[] args) {
        String str = "old"; // 在stack 里为变量str分配一内存空间,在data segment
                                     //分配内存空间,内容为“old”;str内容指向“old”

        System.out.println(str);//结果是"old"
        change(str);         //调用change(),这个str在方法内声明,所以属于局部变量,
                                    //因此在statck里分配为str分配一内存空间,然后这个change()的str也指向
                                     //data segment 里的“old”;接下来在data segment里分配一内存,内容
                                     //为"new",然后让change()的str指向这个“new”。change()运行结束,局
                                     //部变量str(change()的str)从stack里消失。只省下成员变量str指向"old"

        System.out.println(str); //"old"
    }
}

2、字符串:
    所有字符串都是String类的实例来实现;这个java文档里有注名;不同的是,用关键子new出来的实例放在堆内存heap;字符串常量则是放在data segment内存区域,这块区域java的编译器对它进行了优化(同一内容只有一份拷贝),所以才会有字符串的“==”和“equals()”的细节问题!好点的java书对这个部分讲的比较细;引用《java核心技术I卷》中的一小段话:
      “如果虚拟机总是将相同的字符串共享,就可以使用 == 运算符检测是否相等。但实际上只有字符串常量是共享的,而 +  或 subString等操作产生的结果都不是共享的。因此,永远不要使用 == 运算符测试字符串的相等性,否则在程序中会出现糟糕的bug,从表面上看很象随机产生的间歇性错误。”
其实只要分析下内存模型,以及对JVM的运行简单了解下就会对String有个深刻的认识!

3、传值还是传递对象的应用?
     分析了内存模型就很容易理解这个问题了!传递的是值,但是这个值并没有包含对象本身,而是一个引用!这也就是斑竹说的不矛盾的所在吧?呵呵!一定要认识到:对象变量并没有实际包含一个对象,而是引用一个对象!在java中,任何对象变量的值都是对存储在另外一处的一个对象的引用,new操作符返回的也是一个引用!

仅供交流,不对之处,还望海涵!

[ 本帖最后由 hotdll 于 2007-2-15 00:07 编辑 ]

论坛徽章:
0
36 [报告]
发表于 2007-02-16 15:49 |只看该作者
原帖由 perryhg 于 2007-2-12 09:41 发表

你喜欢和人讨论,并且讨论中也不断思考,这很好,本版欢迎这样的气氛,但是讨论中不要妄下断言,动不动就叫人反省,你自己怎么不反省?人家说的一定是错的吗?

把类分为“可变类”和“不可变类”只不过是一种 ...


:m01:
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP