java对象引用的问题

fengwind1 2012-03-27 05:05:57
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
两个输出结果不一样,怎么解释?
...全文
240 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengwind1 2012-03-30
  • 打赏
  • 举报
回复
自己来解释
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的值并不会改变



hepeng_8 2012-03-27
  • 打赏
  • 举报
回复
楼主,

import userandtest.User;

public class StribgTest1 {
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的方法,怎么会是这样的结果?
老9 2012-03-27
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 fengwind1 的回复:]
引用 10 楼 ce2010 的回复:

LZ,首先要清楚java中的参数传递都是值传递,对于原生数据类型,直接把值传给形参,对与对象,则是对象引用地址传给形参。
下面来看你的change2方法:
Java code

void change2(User u) {
u = new User();
u.setName("aaa");
}


传入的是u2这个引用地址,方法u的……
[/Quote]
不是你那么理解的,u2仍然是指向原来的对象,调用change2方法就相当于是u=u2也就是把u2的地址值赋值给了u,而u2的地址值是没有变化。
fengwind1 2012-03-27
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 ce2010 的回复:]

LZ,首先要清楚java中的参数传递都是值传递,对于原生数据类型,直接把值传给形参,对与对象,则是对象引用地址传给形参。
下面来看你的change2方法:
Java code

void change2(User u) {
u = new User();
u.setName("aaa");
}


传入的是u2这个引用地址,方法u的指向了u2对应的对象,在u = new User……
[/Quote]
我的理解是这样的,
u2先指向第一个新建的User对象,通过chang2方法,u2指向另一个新建的对象,那就是说u2的指向的对象已经变了,但是u2.getName为空说明u2的引用并没有改变,这个怎么理解
fengwind1 2012-03-27
  • 打赏
  • 举报
回复
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.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);
pair00 2012-03-27
  • 打赏
  • 举报
回复
楼主可能写错了,调用了两次test.change1
老9 2012-03-27
  • 打赏
  • 举报
回复
LZ,首先要清楚java中的参数传递都是值传递,对于原生数据类型,直接把值传给形参,对与对象,则是对象引用地址传给形参。
下面来看你的change2方法:

void change2(User u) {
u = new User();
u.setName("aaa");
}

传入的是u2这个引用地址,方法u的指向了u2对应的对象,在u = new User();
之前u的指向的对象都没有发生变法,在new完之后,堆里面生成了一个新的user对象,并且u重新指向了这个新创建的对象,你修改的name值只是修改了新创建的这个对象,而并非修改了u2所指对象的内容。
五哥 2012-03-27
  • 打赏
  • 举报
回复
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.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
五哥 2012-03-27
  • 打赏
  • 举报
回复

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
X497347200 2012-03-27
  • 打赏
  • 举报
回复
java 代码那个标签是什么样子的?
X497347200 2012-03-27
  • 打赏
  • 举报
回复
<code=java>

</code>
五哥 2012-03-27
  • 打赏
  • 举报
回复
void change2(User u){
u=new User(); //你重新创建了一个对象引用 ,局部变量把传进来的变量给覆盖了
u.setName("aaa");
}
X497347200 2012-03-27
  • 打赏
  • 举报
回复
额 楼主想考我们这些没安jdk的么
pair00 2012-03-27
  • 打赏
  • 举报
回复
void change2(User u){
u=new User();
u.setName("aaa");
}

问题出在这里,u=new User();你又从新New了一遍,从新在内存中分配了空间,下面也相当于从新赋值了。
你在调用的时候,还用u2.getName(),是不能取到的。
菖蒲老先生 2012-03-27
  • 打赏
  • 举报
回复
你这代码能跑么
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");
}
}
宏Lee 2012-03-27
  • 打赏
  • 举报
回复
我表示我这样完全没问题
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;
}
}
和你的一样

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧