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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李维 初级黑马   /  2012-4-15 11:40  /  2135 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class myMain {
public static void main(String[] args) {
  // TODO Auto-generated method stub
  int num=0;
  Integer integer=new Integer(1);
  My_Text mytext=new My_Text();
  String str=new String("str");
  add(num);
  add(integer);
  modify(mytext);
  modify(str);
  System.out.println(""+num);
  System.out.println(""+integer);
  System.out.println(""+mytext.i);
  System.out.println(str);
}
public static void add(Integer num){
  num++;
}
public static void modify(My_Text mytext){
  mytext.i=12;
}
public static void modify(String str){
  str="str1";
}
}
class My_Text{
int i=0;
String str="30";
}

输出结果:
0
1
12
str
为什么?  
String Integer  My_Text  同样是引用数据类型为什么
My_Text  却改变了值 而 String Integer却没有

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

3 个回复

正序浏览
1、堆内存产生新对象;栈内存存放某个函数的栈控件、对象变量
2、在堆内存中的新对象的成员变量会被初始化;栈内存中的对象变量存储的是堆内存中实例化对象的首地址(对象的引用距离)
3、除基本数据类型之外的其他变量类型都是引用类型。
你的My_Text 类是引用类型,但是你修改的是这里面的int基本数据类型,所以你修改当然生效啦。因为在堆内存中已经初始化赋值了的,那么当它
修改之后,堆内存地址不变,但是里面的值却修改了。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
首先你要知道、String str=new String("str");   这个代码做了什么动作。  这个str对象是指向 堆内存 “str”,所以你打出来的应该是str 、
回复 使用道具 举报
String对象是不可变的,在String对象作为参数传递时,它本身的数值是不会随着形参的值改变而改变的,如:
public class Method{
   String str = new String("good"); //创建了一个String对象
         char[] ch = {'a','b','c'};
        public static void main(String[] args)
  {
               Methodex=new Method();
               ex.change(ex.str,ex.ch);
               System.out.print(ex.str+"---");//good---
               System.out.print(ex.ch);//gbc
         }
   public void change(String str,char ch[])
   {
     str="test ok";//重新创建了一个对象,本身的String对象的值没有变化
     ch[0]='g';//改变引用数组中的值
   }
}

String与数组对比来看,可以说成String对象的参数传递是引用类型传递的特殊形式。

至于 Integer:
   理解这里的关键是区分对象和引用。 这里声明的integer是一个引用,而不是一个对象(只是Java把它设计为看上去好像是对象一样)。这个引用它指向了一个对象,这个对象就是后面用new关键字生成的对象。因此,可以说integer指向了一个Integer对象。
在调用test方法的时候,程序将 integer 作为参数传递给 add 方法了。这里仍然是值传递,在 add  调用过程中,会产生一份新的引用(不妨叫做y)。此时,integer 和y指向了同一个对象。
   integer 和 y 指向的是同一个对象, 由于Java的设计,我们可以通过操作引用来达到操作对象的目的。因此,如果我们此时使用y来修改对象的属性 (例如,y.someField++); 你可以看到 integer 指向的对象同时也被修改到了。
   另一方面,如果我们让 y 指向另外一个对象, y= num++; 此时 integer  和y就指向了不同的对象。y修改了它指向的对象的属性,很显然不会影响到 integer  指向的对象

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马