public class Test{
public static void main(string[] args){
User u1=new User();
User u2=new User();
Test test=new Test();
test.change1(u1);
System.out.println(u1.getName());
test.change1(u2);
System.out.println(u2.getName());
}
void change1(User u){
u.setName("aaa");
}
void change2(User u){
u=new User();
u.setName("aaa");
}
}
输出:aaa
null
两个输出结果不一样,怎么解释?
public static void main(string[] args){
User u1=new User();
User u2=new User();
Test test=new Test();
test.change1(u1);
System.out.println(u1.getName());
test.change1(u2);
System.out.println(u2.getName());
}
void change1(User u){
u.setName("aaa");
}
void change2(User u){
u=new User();
u.setName("aaa");
}
}
输出:aaa
null
两个输出结果不一样,怎么解释?
public class Test {
public static void main(String[] args) {
User u1 = new User();
User u2 = new User();
Test test = new Test();
test.change1(u1);
System.out.println(u1.getName());
test.change1(u2);
System.out.println(u2.getName());
} void change1(User u) {
u.setName("aaa");
} void change2(User u) {
u = new User();
u.setName("aaa");
}}class User {
private String name; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}
和你的一样
string[] 改成 String[] //S大写还有结果应该是一样的啊,都是aaa
class User {
String name = null; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}public class Test {
public static void main(String[] args) {
User u1 = new User();
User u2 = new User();
Test test = new Test();
test.change1(u1);
System.out.println(u1.getName());
test.change1(u2);
System.out.println(u2.getName());
} void change1(User u) {
u.setName("aaa");
} void change2(User u) {
u = new User();
u.setName("aaa");
}
}
u=new User();
u.setName("aaa");
}问题出在这里,u=new User();你又从新New了一遍,从新在内存中分配了空间,下面也相当于从新赋值了。
你在调用的时候,还用u2.getName(),是不能取到的。
u=new User(); //你重新创建了一个对象引用 ,局部变量把传进来的变量给覆盖了
u.setName("aaa");
}
class User{
public User(){
} private String name ;
public void setName(String name) {
this.name = name ;
}
public String getName(){
return this.name ;
}
}public class Test2{
public static void main(String[] args){
User u1=new User();
User u2=new User();
Test2 test=new Test2();
test.change1(u1);
System.out.println(u1.getName());
test.change1(u2);
System.out.println(u2.getName());
}
public void change1(User u){
u.setName("aaa");
}
public void change2(User u){
System.out.println("参数u :" + u ) ;
u=new User(); //应该是 u重新指向了新的对象引用,而不是你传递进来的对象
System.out.println("新建u :" + u ) ;
u.setName("aaa");//
}
}结果:F:\javaTest>java Test2
aaa
aaa
public User(){
} private String name ;
public void setName(String name) {
this.name = name ;
}
public String getName(){
return this.name ;
}
}public class Test2{
public static void main(String[] args){
User u1=new User();
User u2=new User();
Test2 test=new Test2();
test.change1(u1);
System.out.println(u1.getName());
test.change2(u2);
System.out.println(u2.getName());
}
public void change1(User u){
u.setName("aaa");
}
public void change2(User u){
System.out.println("参数u :" + u ) ;
u=new User(); //应该是 u重新指向了新的对象引用,而不是你传递进来的对象
System.out.println("新建u :" + u ) ;
u.setName("aaa");//
}
}结果:F:\javaTest>java Test2
aaa
参数u :User@c3c749
新建u :User@150bd4d
null
下面来看你的change2方法:void change2(User u) {
u = new User();
u.setName("aaa");
}传入的是u2这个引用地址,方法u的指向了u2对应的对象,在u = new User();
之前u的指向的对象都没有发生变法,在new完之后,堆里面生成了一个新的user对象,并且u重新指向了这个新创建的对象,你修改的name值只是修改了新创建的这个对象,而并非修改了u2所指对象的内容。
public static void main(String[] args){
User u1=new User();
User u2=new User();
Test test=new Test();
test.change1(u1);
System.out.println(u1.getName());
test.change2(u2);
System.out.println(u2.getName());
}
void change1(User u){
u.setName("aaa");
}
void change2(User u){
u=new User();
u.setName("aaa");
}
}
输出:aaa
null
两个输出结果不一样,怎么解释?
---------------------------------------
刚才写错了,第二个是test.change2(u2);
u2先指向第一个新建的User对象,通过chang2方法,u2指向另一个新建的对象,那就是说u2的指向的对象已经变了,但是u2.getName为空说明u2的引用并没有改变,这个怎么理解
public static void main(String[] args) {
User u1 = new User();
User u2 = new User();
StribgTest1 test = new StribgTest1();
test.change1(u1);
System.out.println(u1.getUname());
test.change2(u2);
System.out.println(u2.getUname());
} void change1(User u) {
u.setUname("aaa");
} void change2(User u) {
u = new User();
u.setUname("aaa");
}
}
这样执行后的结果是:
aaa
null
但是你调用的两个都是change1的方法,怎么会是这样的结果?
User u1 = new User();产生一个对象和对象引用u1,u1指向这个对象
void change1(User u) {
u.setUname("aaa");
}
调用chang1方法时又产生一个对象引用u,并把u1指向的地址给u,即u与u1指向的地址相同,当u的name改变是,u1的name也改变,因为他们指向是同一个地址。
void change2(User u) {
u = new User();
u.setUname("aaa");
}
调用chang2方法时又产生一个对象引用u,并把u1指向的地址给u,即u与u1指向的地址相同,当执行 u = new User();时产生一个新对象,同时u指向次对象,即u1和u指向的地址不一样,当改变u的值时u1的值并不会改变