黑马程序员技术交流社区

标题: 几个小疑问 [打印本页]

作者: slatop@qq.com    时间: 2013-5-14 11:04
标题: 几个小疑问
本帖最后由 刘胜寒 于 2013-5-18 03:21 编辑

  1.    JAVA中没有无符号修饰符?unsigned
  那如果定义IP地址段变量,即不是最少要用short而最适合做ip段的byte却因为取值范围不足用不了。


  2     JAVA中函数参数数量不可变?如果是这样的话,那么JAVA中函数的参数压栈顺序是自左向右还是自右向左



  3    JAVA中所有new关键词建立的对象都在堆中。那么反之是不是所有堆中对象都必须有new关键词,如果不是请举例
作者: 刘胜寒    时间: 2013-5-14 11:52
1,没有,如果硬要说有的话,就是默认修饰符default。
2,这个真不知道。。。其实是从左到有。原因我忘了。因为函数中的参数是按照数组的形式传递进去的。
3,个人觉得是的。

等高人路过。。。



作者: 乎¤_¤乎    时间: 2013-5-14 11:57
3、不是啊
比如String s=new String(“123”)
对象s是new出来的 对象123就不是咯
作者: slatop@qq.com    时间: 2013-5-14 12:51
乎¤_¤乎 发表于 2013-5-14 11:57
3、不是啊
比如String s=new String(“123”)
对象s是new出来的 对象123就不是咯 ...

你说的这个其实也是new出来的呵呵。
严格的说String是"123"的封装,String内部有一个指针属性指向存在"123"的地址。"123"应该也不是在文字常量区的。本身常量区就很有限,如果这样的形势也是存放在常量区那么很快文字常量区的内存就满了。
因为JAVA的强类型机制,以及舍去了指针和运算符重载的概念,导致测试起来挺麻烦的,不过我还是坚信"123"是存放在堆中的。只是将地址交给了String的成员保存。
String str3 = new String("123");
String str1 = "123";
String str2 = "123";

测试结果。1和2地址相同。3和以上两个都不同。文字常量区中的数据是会被重用的,如果String str3 = new String("123");
也是存放在文字常量区那么,他们的地址应该是相同的。

另外:在C++中可以通过string下标重载运算符直接修改new出来的字符串对象。而文字常量区的数据是不能被修改的。至于为什么在JAVA中字符串一但初始化就不能修改,其原因应该是String的封装方法将所有元素返回值都定为了常量的原因。
String str = "123";"123"是存放在常量区的。str是在栈区
String str = new String("123");str在栈区,String类封装的属性在堆区,"123"也应该是在堆区

作者: 乎¤_¤乎    时间: 2013-5-14 16:51
首先我们要明白String s = new String("123");创建了几个对像。
创建了两个,语句"123"创建了一个对象,这是在java里唯一不需要new就能创建对象的,new String("123")又创建了一个对象。但他们有本质的区别,他们存放的地方不一样。"123"是存放在栈内存中的,用new创建的对象都是在堆内存中。

作者: 乎¤_¤乎    时间: 2013-5-14 16:51
上面是摘抄自某老兄的博客
作者: slatop@qq.com    时间: 2013-5-14 17:26
乎¤_¤乎 发表于 2013-5-14 16:51
首先我们要明白String s = new String("123");创建了几个对像。
创建了两个,语句"123"创建了一个对象,这 ...

JAVA中完全屏蔽对地址的操作,我也没办法测试。但是我依然觉得new String("123")其中的123应该是在堆中的。
根据1.毕老师说过,JAVA中所有的非局部对象都是在堆中的。
根据2.int[] arry ={1,2,3,4,5}这样的初始化也是在堆中的。
根据3.在C++中new String("123")这个肯定是在堆中的没有疑问。java简介于C++很多特性,不应该会傻到将一个大容易数据放在栈中,更不可能在常量文字区中
根据4.根据我的经验,String在编程实际运用中是须要储存越大数据的。比如你读入文章文件等。如果只是在栈中,那可想而知内存很快会满。在Win32平台下,栈的空间大小只有2M
作者: xuemeng    时间: 2013-5-14 17:39
本帖最后由 xuemeng 于 2013-5-14 17:41 编辑

额,懒得打字, 直接上个图吧!!  下面的图说明  new String("123")做了什么,  虽然答案和你的牛头不对马嘴, 不过能够充分为你解惑, 而且还告诉了你另外的知识, 哈哈  不过是以前自己的笔记, 所以hello我就没改成123了

未命名.png (16.74 KB, 下载次数: 0)

未命名.png





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