1.1 引用传递及基本应用
1.1.1 引用传递
引用传递就是指将堆内存空间的使用权交给多个栈内存的空间。
对象引用传递:
class Demo{
int temp = 30;
}
class TestJava0501{
public static void main(String[] args) {
Demo d1 = new Demo();
d1.temp = 50;
System.out.println("fun()方法调用之前" + d1.temp);
fun(d1);
System.out.println("fun()方法调用之后" + d1.temp);
}
public static void fun(Demo d2){
d2.temp = 100;
}
}
运行结果:
fun()方法调用之前50
fun()方法调用之后100
在fun方法之中接收了Demo类对象d1,并将temp属性的内容进行了修改,因为是引用传递,所以最终temp的值是1000,此程序可以通过下图表示:
引用传递2:
class RefDemo02{
public static void main(String[] args) {
String str1 = "hello";
System.out.println("fun()方法调用之前" + str1);
fun(str1);
System.out.println("fun()方法调用之后" + str1);
}
public static void fun(String str2){
str2 = "kity";
}
}
运行结果:
fun()方法调用之前hello
fun()方法调用之后hello
虽然此时传递的是一个String类型的对象,但是结果并没有像之前一样发生改变,因为字符串的内容一旦声明是不可改变的,改变的知识其内存地址的指向。本程序的内存操作图如下:
引用传递3:
class Demo03{
String temp = "hello";
}
class RefDemo03{
public static void main(String[] args) {
Demo03 d1 = new Demo03();
d1.temp="world";
System.out.println("fun()方法调用之前" + d1.temp);
fun(d1);
System.out.println("fun()方法调用之后" + d1.temp);
}
public static void fun(Demo03 d2){
d2.temp="MLDN";
}
}
运行结果:
fun()方法调用之前world
fun()方法调用之后MLDN
内存操作图:
1.1.2 接受本类的引用
以上为引用产地的基本形式,实际上在对象引用传递上也可以在一个类中接收自己本类对象的实例,而且接受完之后,可以方便地通过此对象进行本类中封装属性的访问,如下代码:
class Demo04{
private int temp = 30;
public void fun(Demo04 d2){
d2.temp = 50;
}
public int getTemp() {
return temp;
}
public void setTemp(int temp) {
this.temp = temp;
}
}
class RefDemo04{
public static void main(String[] args) {
Demo04 d1 = new Demo04();
d1.setTemp(50);
d1.fun(d1);
System.out.println("temp = " + d1.getTemp());
}
}
运行结果:
temp = 50
因为在类的内部,所以可以访问其中的私有属性,因此只要符合引用传递的语法,则可以向任意地方传递。
1.1.3 范例——一对一关系
实际上使用引用传递还可以表示出生活中的以下一种场景,例如,一个人有一本书,一本书属于一个人。因而可以得出这样的结论:人应该是一个具体的类,书也应该是一个具体的类,在人的类中应该存在一个属性表示书,在书的类中也应该存在一个属性表示人。
class Person01{
private String name;
private int age;
private Book book;
public Person01(String name, int age){
this.setName(name);
this.setAge(age);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Book getBook() {
return book;
}
public void setBook(Book book) {
this.book = book;
}
}
class Book{
private String title;
private float price;
private Person01 person01;
public Book(String title, float price){
this.setTitle(title);
this.setPrice(price);
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public Person01 getPerson01() {
return person01;
}
public void setPerson01(Person01 person01) {
this.person01 = person01;
}
}
class RefDemo05{
public static void main(String[] args) {
Person01 per = new Person01("张三",30);
Book bk = new Book("java开发实战经典", 12.5f);
per.setBook(bk);
bk.setPerson01(per);
System.out.println("从人找到书名--姓名:" + per.getName() + "; 年龄:" + per.getAge() + "; 书名:" + per.getBook().getTitle() + "; 价格:" + per.getBook().getPrice());
System.out.println("从书名找到人--书名:" + bk.getTitle() + "; 价格:" + bk.getPrice() + "; 姓名:" + bk.getPerson01().getName() + "; 年龄:" + bk.getPerson01().getAge());
}
}
运行结果:
从人找到书名--姓名:张三; 年龄:30; 书名:java开发实战经典; 价格:12.5
从书名找到人--书名:java开发实战经典; 价格:12.5; 姓名:张三; 年龄:30
人和书有关联关系,如图: