java对象引用传递问题看这个程序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java对象引用传递问题看这个程序相关的知识,希望对你有一定的参考价值。
class Person // 定义Person类
private String name ; // 姓名
private int age ; // 年龄
private Book book ; // 一个人有一本书
public Person(String name,int age)
this.setName(name) ;
this.setAge(age) ;
public void setName(String n)
name = n ;
public void setAge(int a)
age = a ;
public String getName()
return name ;
public int getAge()
return age ;
public void setBook(Book b)
book = b ;
public Book getBook()
return book ;
;
class Book // 定义Book类
private String title ; // 标题
private float price ; // 价格
private Person person ; // 一本书属于一个人
public Book(String title,float price)
this.setTitle(title) ;
this.setPrice(price) ;
public void setTitle(String t)
title = t ;
public void setPrice(float p)
price = p ;
public String getTitle()
return title ;
public float getPrice()
return price ;
public void setPerson(Person p)
person = p ;
public Person getPerson()
return person ;
;
public class RefDemo05
public static void main(String arg[])
Person per = new Person("张三",30) ;
Book bk = new Book("JAVA SE核心开发",90.0f) ;
per.setBook(bk) ; // 设置两个对象间的关系,一个人有一本书
bk.setPerson(per) ; // 设置两个对象间的关系,一本书属于一个人
System.out.println("从人找到书 --> 姓名:" + per.getName()+";年龄:"
+ per.getAge() +";书名:" + per.getBook().getTitle() + ";价格:"
+ per.getBook().getPrice()) ; // 可以通过人找到书
System.out.println("从书找到人 --> 书名:" + bk.getTitle() + ";价格:"
+ bk.getPrice() + ";姓名:" + bk.getPerson().getName() + ";年龄:"
+ bk.getPerson().getAge()) ; // 也可以通过书找到其所有人
;
我想问这个程序中per.setBook(bk);
public void setBook(Book b)
book = b ;
它把对象bk传到setBook()方法中然后又把对象赋值给了book 它把什么赋给了book?
还有那个 per.getBook().getTitle()这个是什么意思?
从引用传递的角度讲讲。。
class Person // 定义Person类
private Book book ; // 一个人有一本书
public void setBook(Book b)
book = b ;
book.setTitle("caca");
public Book getBook()
return book ;
;
class Book // 定义Book类
private String title ; // 标题
public Book(String title)
this.title = title;
public void setTitle(String t)
title = t ;
public String getTitle()
return title ;
;
public class Test2
public static void main(String arg[])
Book book = new Book("hello");
Person person = new Person();
System.out.println("book.getTitle()---" + book.getTitle());
person.setBook(book);
System.out.println("person.getBook().getTitle()---" + person.getBook().getTitle());
System.out.println("book.getTitle()---" + book.getTitle());
System.out.println();
;
你的代码太长了,主要就是看上面这几行。理解我下面说的话,差不多就都理解了。
这里的输出结果是:
book.getTitle()---hello
person.getBook().getTitle()---caca
book.getTitle()---caca
为什么book.getTitle()前后的值不一样呢?
因为,setBook(book)方法中传递的实际上是一个指针,是对名字为”hello“的书的引用。person接收到这个引用之后,又对book里的名字赋值,更改为”caca"。最后,执行book.getTitle()时,
又是同一个引用。注意的是,从始至终,就只有一个真正的book,其他的都是对这个book的引用。因为,你只new了一个。 参考技术A book = b 是把 b这个引用变量所指的对象赋值给了book,就是让book这个引用变量指向b所指向的同一个对象
per是一个Person对象,per.getBook()可以得到per对象的成员book,就是返回了per.book这个对象
得到了per.book这个对象之后,又调用了Book类的getTitle()方法,得到per.book.title这个String类型的对象 参考技术B per.setBook(bk) ;是实现了 人有书的思想
bk.setPerson(per);是实现了 书属于人的思想,
setBook(Book book)当然是把书传递给人这个类里面 实现了这个私有成员private Book book;
per.getBook().getTitle()先说 per.getBook()这个是得到 人中的那本书,per.getBook().getTitle();就是获得那本书的标题;
这个可以拆开写
Book book=per.getBook();
String title=book.getTitle(); 参考技术C 问题1:Book bk = new Book("JAVA SE核心开发",90.0f) ;
这里的bk是一个引用也可以说是一个地址,这个地址指向一个内存区,这个内存区放着书名,和价格。per.setBook(bk) 把这个引用传递给person类里面的setBook()这个方法, book = b ;把指向书名和价格的这个地址传递给了book,
问题2:per.getBook().getTitle()外面一层层的看 per.getBook()得到的是一个引用也就是那个bk,而bk.getTitle()就是调用Book里面的getTitle()这个方法。 参考技术D per.setBook(bk) ; 是把bk对象在内存中的地址赋给了per对象的book属性,这样per.book和bk都指向了内存中的同一个地址。
per.getBook().getTitle(),首先per.getBook()返回的是book对象,然后又调用book对象的getTitle()返回title属性
Java中的值传递和引用传递
这几天一直再纠结这个问题,今天看了这篇文章有点思路了,这跟C++里函数参数为引用、指针还是有很大区别。
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
答:是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本。指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)是永远不会改变的。
Java参数,不管是原始类型还是引用类型,传递的都是副本(有另外一种说法是传值,但是说传副本更好理解吧,传值通常是相对传址而言)。
以上是关于java对象引用传递问题看这个程序的主要内容,如果未能解决你的问题,请参考以下文章