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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 做個、堅強de女 黑马帝   /  2011-11-16 19:10  /  3062 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class Book {

private String name = null;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

public class ParseHtml {


public void bookxiugai(Book book){
book = new Book();
}

public static void main(String[] args) {
ParseHtml p = new ParseHtml();
Book book = null;
p.bookxiugai(book);//方法参数是对象,按说应该是引用传递,方法的修改应该影响实际参数book,打印结果应该为非null,
System.out.println(book);

}
}

p.bookxiugai(book);//方法参数是对象,按说应该是引用传递,方法的修改应该影响实际参数book,打印结果应该为非null,可是打印却为null,为什么?

该贴已经同步到 做個、堅強de女的微博

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

6 个回复

正序浏览
你才开始java? 黑马的同学?

来自 lucky_xingxing 的新浪微博
回复 使用道具 举报
如果是在方法内修改参数对象的属性的话,在引用方法中就可以看到对象的变化。像楼主这样把book = new Book()的话,book这个直接指向另外一个地址了。引用方法中的还是指向原来那个地址。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
基本数据类型是按值进行传递的
引用数据类型是按址进行传递的

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
java的本身实质还是传质的。这个是不变的,呵呵。那个传引用之说,其实是传引用之值也就是那个对象的地址值(归根结底还是传值)。
首先你将book的值赋值为null,然后再调用p.bookxiugai(book)方法,这个时候就是把book中的null复制一份到p.bookxiugai(book)这个局部的book变量中,
然后你再在方法内部对book这个局部变量进行赋值(book = new Book()),当方法退出时这个局部变量也就不存在了,而外部的那个book变量的值一直都是null值.
就是你现在的结果。

如果开始在外面 book= new Book();就先进行赋值了,再调用p.bookxiugai(book)时,这个时候也是把book中的值(现在是new的那个对象的地址值了,也就是一个地址,也就是说的引用)复制一份到p.bookxiugai(book)这个局部的book变量中些时如果在方法内部使用book对象去调用它的方法,那么就是通过那个引用的地址去使用那些东西。也就是我们平常所看到的那样,如果我们再在方法内部使用book = new Book(),那么这个局部变量又指向另一块内存了,但外面的那个book仍然还是没有变,还是指向原来的那个book对象。所以就是这样,这样理解就一切没有冲突了哈。你也可以自己编程测试一下。

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
book = new Book();
这句话改变了初衷,如果没有这句话就会是传递引用,这个咱老师那个视频中还专门强调了,有时间了再看看。
回复 使用道具 举报
Book book1 = null;
p.bookxiugai(book2);{
book 2= new Book();
}
book1的值为null,
p.bookxiugai(book2)将null赋给
book2,然后book2=new book(),
但是book1本身的值没变啊,
传递的是引用,改变的是引用指向的内容,但是引用本身是不变的

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1

查看全部评分

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