谁能解释一下最后一个例子
Topic sourceString bob = "Bob"; //等效写法:String bob = new String("Bob"); 此时 bob变量指向的是 new出来的字符串对象的内存地址
p.setName(bob); // 传入bob变量;等效于将p中的类变量 name,设置为跟bob一样的内存地址。注意,name其实是指向的一个内存地址
bob = "Alice"; // bob改名为Alice;等效于 bob = new String("Alice"); 此时bob变量指向一个新的new出来的字符串对象内存地址,里面放的是 Alice
// 同时,p中的类变量name,还是指向的之前"Bob"字符串的内存地址
java把C++里的指针概念模糊了,其实这里就是C++里的 string *bob = new string("Bob"); p.name = bob; bob = new string("Alice");
String 是字符串类型,如果要改变值,需要新建一个内存空间,然后指向到这个空间
String[] 是字符串数组,如果改变其中的值,并不会创建新的内存空间,改变的只是索引后的值。
前面说到的java有两大基本类型,基本类型和引用类型。然后又说了引用类型赋值改变的是同个对象,而String是个特殊的引用类型,赋值其实是会开辟新的内存空间,所以改变的不是同个对象,所以对person.getName()没有影响,若有不对的地方欢迎各位指正
String 属于引用类型,每次赋值实际上是又开辟了一片空间,所以他的指向地址发生了变化。
传递参数属于引用传递,也就是地址,所以两次输出信息一样。
举个例子:你家地址是101,你叔叔知道你家的地址为 101,你叔叔来你家就是通过地址才能过来,有天你搬家了,告诉你叔叔你家的新地址,他来你家做客是不是就是通过新地址?
数组对象和string对象不一样。
两次都是赋值。第一个是String name[]数组,所以是连续的两个地址,即name0 name1 name2是分别指向不同的String对象,name数组是一个对数组象,所以实际上是两个引用指向了同一个数组对象,修改其中一个数组对象中的一个引用,所以就改变了。
- 1
- 2
Ljm68077
说白了就是b=Alice这个值并没有通过set方法把值赋进去,你的名字从张三改成了李四,但是身份证的名字仍然是张三,那么get方法看的还是你身份证