方法的参数传递机制:实参给形参赋值
- 方法的形参是基本数据类型时,形参值的改变不会影响实参;
- 方法的形参是引用数据类型时,形参地址值的改变不会影响实参,但是形参地址值里面的数据的改变会影响实参,例如,修改数组元素的值,或修改对象的属性值。
- 实参给形参赋值,引用数据类型和基本数据类型赋值不同:
基本数据类型:数据值
引用数据类型:地址值
特殊的类型:String、包装类等对象不可变
*示例代码一:
基本数据类型:
class Test{
public static void change(int a){
int a=2*a;
}
public static void main(String[] args){
int num=1;
change(num);
System.out.printIn("num="+num);//num=1
}
}
示例代码二:
引用数据类型:
class Test{
public static void change(MyData my){
my.x= 2*my.x;
}
public static void main(String[] args){
MyData m = new MyData();
m.x = 1;
change(m);//调用完之后,m对象的num属性值就变为2
}
}
class MyData{
int x;
}
示例代码三:
引用数据类型:
public class Test {
public static void main(String[] args) {
int[] arr = {2,4,1,5,3};
ArrayUtil.sort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
class ArrayUtil{
public static void sort(int[] arr){
for (int i = 1; i < arr.length; i++) {
for (int j = 0; j < arr.length - i; j++) {
if(arr[j] > arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
}
示例代码四:
/*
陷阱1:在方法中,形参 = 新new对象,那么就和实参无关了
*/
class Test{
public static void change(MyData my){
my = new MyData();//形参指向了新对象
my.num *= 2;
}
public static void main(String[] args){
MyData m = new MyData();
m.num = 1;
change(m);//调用完之后,m对象的num属性值仍然为1
}
}
class MyData{
int num;
}
示例代码五:
String类型的数据是存储在常量池中的,其拥有不可变性。当我们对字符串进行相应的拼接操作时,其底层会去new StringBuilder(),然后执行append()方法。最终会在常量池中创建一个新的字符串,且将其地址值赋值给对应的String类型的变量。
public class Test {
public static void main(String[] args) {
StringUtil util = new StringUtil();
String str = "hello";
util.change(str);
System.out.println(str);
}
}
class StringUtil{
public void change(String str){
str += "你好";//String对象不可变,一旦修改就会产生新对象
}
示例代码六:
public class Test02 {
public static void main(String[] args) {
Integer a = 1;
Integer b = 1;
System.out.println(a == b);
Integer a2 = 2;
Integer b2 = 2;
System.out.println(a1 == b1);
}
}
Integer数据在不同情况下存储位置的不同
Integer类型 默认-128~127存储在方法区,超过范围的数据存储在堆中(每创建一次就会开辟一块内存空间)。