介绍一下java里面三种引用传递
Demo 1
public class ChapterFive {
public static void main(String[] args) {
Demo1 d1 = new Demo1(); // 实例化Demo1对象
d1.temp = 50; // 修改 temp 属性值
System.out.println("调用 fun() 函数前:" + d1.temp);
fun(d1);
System.out.println("调用 fun() 函数后:" + d1.temp);
}
public static void fun(Demo1 d2){ // 此处的方法由主方法直接调用
d2.temp = 1000;
}
}
class Demo1{
int temp = 30;
}
运行结果
调用 fun() 函数前:50
调用 fun() 函数后:1000
我们分析一下内存变化过程
一开始,类Demo1的成员变量初始化为30,在主程序里,实例化了一个对象d1,指向的堆内存值是初始化的temp=30,然后对象d1在外部更改了属性temp的值,这时候,堆内存的地址改变为temp=50,接着调用fun(d1),生成了一个新的对象 d2,一开始d2指向的堆内存地址也是temp=50,但是在执行fun函数时,内部又将temp的值变为1000,同时,d1指向的堆内存地址也变成temp=1000.
Demo 2
public class ChapterFive {
public static void main(String[] args) {
String str1 = "hello";
System.out.println("调用 fun() 函数前:" + str1);
fun1(str1);
System.out.println("调用 fun() 函数后:" + str1);
}
public static void fun1(String str2){ // 此处的方法由主方法直接调用
str2 = "MLDN";
}
}
运行结果:
调用 fun() 函数前:hello
调用 fun() 函数后:hello
Demo 3
public class ChapterFive {
public static void main(String[] args) {
Demo1 d1 = new Demo1();
d1.temp = "world";
System.out.println("调用 fun() 函数前:" + d1.temp);
fun1(d1);
System.out.println("调用 fun() 函数后:" + d1.temp);
}
public static void fun1(Demo1 d2){ // 此处的方法由主方法直接调用
d2.temp = "MLDN";
}
}
运行结果:
调用 fun() 函数前:world
调用 fun() 函数后:MLDN
一对一关系
实际上引用传递可以对应于实际生活中的一些场景,比如说一个人有一本书,我们也可以理解为一本书属于一个人。
class Person{
// 封装属性
private String name;
private int age;
private Book bk;
// 构造方法 目的就是为类中的属性初始化
public Person(String n, int a){
this.setName(n);
this.setAge(a);
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
if(age>=0 && age <=120) {
this.age = age;
}
}
public Book getBk() {
return bk;
}
public void setBk(Book bk) {
this.bk = bk;
}
public int getAge() {
return age;
}
public void tell(){
System.out.println("name: " + name + " age: " + age);
}
}
class Book{
private String title;
private float price;
private Person person;
public Book(String title, float price){
this.setPrice(price);
this.setTitle(title);
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
public class ChapterFive {
public static void main(String[] args) {
Person person = new Person("张三", 30);
Book bk = new Book("《Java从入门到放弃》", 33.0f);
person.setBk(bk);
bk.setPerson(person);
System.out.println("从人找到书 --> 姓名:" + person.getName() + " 年龄:" + person.getAge()
+ " 书名:" + person.getBk().getTitle() + " 价格:" + person.getBk().getPrice()
);
System.out.println("通过书找到人 --> 书名:" + bk.getTitle() + " 价格:" + bk.getPrice() +
" 姓名:" + bk.getPerson().getName() + " 年龄:" + bk.getPerson().getAge()
);
}
}