java中所有的传递都是值传递。
今天才对这句话深入理解。(语言都是相通的,对这句话简直五体投拜)
java中方法的所有传值都是值传递,所谓值传递就是向方法中传递的是参数值的一个副本。而如果java方法的形参类型是基本类型的时候方法内部的改变时不会影响方法外部的实参的。(这里和C跟C++的思想是一样的)如果java方法的形参类型是引用类型的时候的值传递就是将实参的值传递给方法,而在引用类型中实参的值就是它指向的他的实例的地址,也就是说实参和形参的值是一样的都是同一个地址,指向了同一个对象,所以当方法内部对形参做了改变的时候外部实参所指向的对象也会跟着变化,但是外部实参的值即一个指向对象的地址是不会发生变化的(包括包装类型,但是包装类型为什么在方法内部却不能改变实参的值呢?稍后在代码中一一解释清楚)。
package diGui;
//这是我练习递归的时候的代码。
//不带返回值的递归思想 书上有的:
//这样虽然实现了递归的思想选择排序但是到底有没有改变list呢?有没有实现对list排序呢
//为什么这样也实现了对list的选择排序呢????
public static void selectionSort1(int[] list){
selectionSort1(list,0,list.length-1);
}
public static void selectionSort1(int[] list,int low,int high){
//只有当满足low<high时候才会进入这个循环否则就直接退出了//即递归退出的条件
//最后归结为一个基本状态,最基础的状态
if(low<high){
int min=list[low];
int indexOfMin=low;
for(int i=low;i<=high;i++){
if(min>list[i]){
min=list[i];
indexOfMin=i;
}
}//将数组中最小值的小坐标标记了
list[indexOfMin]=list[low];
list[low]=min;
selectionSort1(list,low+1,high);
}
}
public static void test(int a){
a++;
}
public static void test(Integer a){
a++;
}
public static void test(double a){
a=a+0.1;
}
public static void test(Double a){
a=a+0.1;
}
public static void test(String a){
a=a+'S';
}
public static void test(char a){
a='C';
}
public static void main(String[] args) {
int[] list1={3,7,1,9,3,2,34,98,54,0};
int[] list={3,7,1,9,3,2,34,98,54,0};
selectionSort1(list1);
for(int i:list1){
System.out.print(i+" ");//0 1 2 3 3 7 9 34 54 98
}
System.out.println();
for(int i:selectionSort(list)){
System.out.print(i+" ");//0 1 2 3 3 7 9 34 54 98
}
int a=1;
test(a);
System.out.println("testint"+a);//输出testint1
Integer integer=new Integer(1);
test(integer);
System.out.println("testInteger"+integer);//输出testInteger1
double d=1.1;
test(d);
System.out.println("testdouble"+d);//输出testdouble1.1
Double d1=new Double(1.1);
test(d1);
System.out.println("testDouble"+d1);//输出testDouble1.1
String s="string";
test(s);
System.out.println("teststring "+s);//输出teststring string
String s1=new String("string");
test(s1);
System.out.println("testString "+s1);//输出testString string
char c='a';
test(c);
System.out.println("testchar "+c);//输出testchar a
}
}
对于包装类型可能会比较有疑惑,为什么包装类型的数据同样是引用数据为什么在方法中不能影响外部实参的值呢?
而8大基本类型的包装类和String类型是有对象池的概念的,并且改变值的时候改变的并不是对象内的值,改变的是对象指向的地址,所以在方法内部形参改变值时,改变是方法内对象的指向,并未改变传入的那个对象的地址内的值,所以不会有变化
----------摘自CSDN某位的回答
总之就是对于包装类和它本身的实现有关,包装类指向的数据是不可变的,一旦构造,就不许更改包装内部所指向的数据,也不能用包装器类实现修改数值参数的方法,对象在算术表达式中会自动的打包和拆包,即分配了一个新的地址,方法内部的形参改变的时候实际上是重新生成了一个包装类对象,形参指向的地址发生了变化。而方法外部的实参指向的对象的地址是不会改变的,所以不会影响方法外部的实参。
疑问:
我这样一想感觉C++中的指针传递和引用传递都是值传递了。