这个问题我在多次编写例题代码的时候有过困惑,思考之后发现找到了很好的理解。
我这里就不说书上的定义了,以下的代码可以说明基本问题
class A{ int aa; A(){aa=10;} }
public class test{
static void charchange(int b){ b++; } //形参是基本类型
static void strchange(String nstr){ nstr="world"; }//形参是String
static void classchange(A a){ a.aa*=2; }//形参是类
static void classnew(A d){ d=new A(); d.aa*=2; }//形参是类,但内部实现方法特别
public static void main(String[] args) {
int i=0;
charchange(i);
System.out.println(i);//上一行函数的作用和下面的三行代码没区别
int b=i;
b++;
System.out.println(i+"\n\n");
String str="hello";
strchange(str);
System.out.println(str);//上一行函数的作用和下面的三行代码没区别
String nstr=str;
nstr="world";
System.out.println(str+"\n\n");
A a=new A();
classchange(a);
System.out.println(a.aa);//上一行函数的作用和下面的三行代码没区别
a.aa=10;
A c=a;
c.aa*=2;
System.out.println(a.aa+"\n\n");
a.aa=10;
classnew(a);
System.out.println(a.aa);//上一行函数的作用和下面的三行代码没区别
A d=new A();
d.aa*=2;
System.out.println(a.aa);
}
}
也就是说:
基本数据类型或者String(本质是类)可以理解为值传递[可以查看String类的构造函数一探究竟],而对于对象:
A a=new A();这个操作以后有了一个类的内存空间,通过引用a可以找到该内存空间,
A b=a;的操作让b也成为一个引用,他的地位和a完全相等
如果再次b=new A();那么b就会变成另一个内存空间引用