对象和引用的概念
-
对象:目前在使用new运算符在堆内存中开辟的内存空间称为对象。
-
引用:是一个变量,不一定是局部变量,还可能是成员变量。
引用保存了内存地址,指向了堆内存当中的对象。所有访问实例相关的数据,都需要通过引用”的方式访问,因为只有通过引用才能找到对象。只有一个空的引用,访问对象的实例相关的数据会出现空指针异常。
非引用的参数传递
package com.diamondk.javase.test04;
/**
* Java语言在调用方法时涉及到参数传递的问题
* 参数传递实际上传递的是变量中保存的具体值
* int i = 10;
* add(i); 等同于 add(10);
*/
public class Test01 {
public static void main(String[] args){
int i = 10;
add(i);
System.out.println("main --> " + i); // 10
}
public static void add(int i){
i++;
System.out.println("add --> " + i); // 11
}
}
引用的参数传递
package com.diamondk.javase.test04;
/**
* 最终结论:
* 方法调用的时候,涉及到参数传递的问题,传递的时候,java只遵循一种语法机制,就是将变量中保存的值”传递过去了,
* 只不过有的时候这个值是一个字面值10,有的时候这个值是另一个jav对象的内存地址0x12344
*/
public class Test02 {
public static void main(String[] args){
User u = new User(20);
// User u = 0x1234
// 传递u给add方法时,实际上传递的是u变量中保存的值,只不过这个值是一个Java对象的内存地址
add(u); //add(0x1234)
System.out.println("main --> " + u.age); // 21
}
private static void add(User u) {
u.age++;
System.out.println("add --> " + u.age); // 21
}
}
class User{
int age;
public User(int i){
age = i;
}
}
int i = 10;
int j = i; // i传递给,实际上只是将i变量中保存的10传递给了,实际上是一块全新的内存空间。
User u1 = 0x1234;
User u2 = u1; //u1传递给u2,实际上是将0x1234这个值赋值给u2了,u和u2实际上是两个不同的局部变量,
//但是它们这两个变量指向堆内存中同一个java对象。