值传递是传递变量的值,并不会改变方法外变量的值
public test (int b){
println(b)
int b=0;
println(b)
}
public void main[String arg]{
int i =1;
test(i)
println(i)
}
输出 1、0、1
引用传递是传递对象的地址,会改变对象本身的值
void swap3(int &x, int &y)
{
int tmp=x;
x=y;
y=tmp;
print(“x=%d, y=%d\n”, x, y);
}
void main()
{
int a=2;
int b=7;
swap3(a,b);
Print(“a=%d, b=%d\n”, a, b);
}
x=7, y=2
a=7, b=2
一般基础数据类型传递都是值传递
对象传递和String类型是引用传递
== 和 equals 的区别
关于比较一般是基础数据类型比较和对象比较
基础数据类型存储在jvm的栈中,即==和equals比较是变量的值,值相同则相同,值不同则不同
对于引用类型来说,对象的内容存储在jvm的堆中,栈只是存储对象的引用(地址),无论是==还是equals比较的都是栈中的内容,即对象的引用。
根据创建对象的方式分为两种情况:
一种是用表达式创建:
一种是用new 创建:
1.为什么表达式创建和new创建,会让==比较产生不同的结果。
这是因为jvm在程序运行的时候会创建一个缓冲池,当使用表达式创建的时候,程序会在缓冲池中寻找相同值的对象,如果找到,就把这个对象的地址赋给当前创 建的对象,因此,c和d实际上都指向了c的引用。因此在使用==时会返回true。
当用new创建对象时,是在堆中重新分配内存,因此栈中的引用是不相同的,所以,a和b引用的是值相同的不同对象。所以a==b返回false
2.既然equals比较的是引用,那么a.equals(b)为什么返回true。这是因为在Integer里,重写了equals方法!