如何在网站做投票,拿p5.js做的网站,成都市建设局官方网站,拖拽式建站平台下面是我在网上看到的一个帖子#xff0c;解释的感觉挺全面#xff0c;就转过来#xff0c;以供以后学习参考#xff1a; 1#xff1a;按值传递是什么 指的是在方法调用时#xff0c;传递的参数是按值的拷贝传递。示例如下#xff1a; [java] view plaincopy public cla… 下面是我在网上看到的一个帖子解释的感觉挺全面就转过来以供以后学习参考 1按值传递是什么 指的是在方法调用时传递的参数是按值的拷贝传递。示例如下 [java] view plaincopy public class TempTest { private void test1(int a){ //做点事情 } public static void main(String[] args) { TempTest t new TempTest(); int a 3; t.test1(a);//这里传递的参数a就是按值传递 } } 按值传递重要特点传递的是值的拷贝也就是说传递后就互不相关了。 示例如下 [java] view plaincopy public class TempTest { private void test1(int a){ a 5; System.out.println(test1方法中的aa); } public static void main(String[] args) { TempTest t new TempTest(); int a 3; t.test1(a);//传递后test1方法对变量值的改变不影响这里的a System.out.println(”main方法中的a”a); } } 运行结果是 [java] view plaincopy test1方法中的a5 main方法中的a3 2按引用传递是什么 指的是在方法调用时传递的参数是按引用进行传递其实传递的引用的地址也就是变量所对应的内存空间的地址。 示例如下 [java] view plaincopy public class TempTest { private void test1(A a){ } public static void main(String[] args) { TempTest t new TempTest(); A a new A(); t.test1(a); //这里传递的参数a就是按引用传递 } } class A{ public int age 0; } 3按引用传递的重要特点 传递的是值的引用也就是说传递前和传递后都指向同一个引用也就是同一个内存空间。 示例如下 [java] view plaincopy public class TempTest { private void test1(A a){ a.age 20; System.out.println(test1方法中的agea.age); } public static void main(String[] args) { TempTest t new TempTest(); A a new A(); a.age 10; t.test1(a); System.out.println(”main方法中的age”a.age); } } class A{ public int age 0; } 运行结果如下 [java] view plaincopy test1方法中的age20 main方法中的age20 4理解按引用传递的过程——内存分配示意图 要想正确理解按引用传递的过程就必须学会理解内存分配的过程内存分配示意图可以辅助我们去理解这个过程。 用上面的例子来进行分析 1运行开始运行第8行创建了一个A的实例内存分配示意如下 2运行第9行是修改A实例里面的age的值运行后内存分配示意如下 3运行第10行是把main方法中的变量a所引用的内存空间地址按引用传递给test1方法中的a变量。请注意这两个a变量是完全不同的不要被名称相同所蒙蔽。 内存分配示意如下 由于是按引用传递也就是传递的是内存空间的地址所以传递完成后形成的新的内存示意图如下 也就是说是两个变量都指向同一个空间。 4运行第3行为test1方法中的变量a指向的A实例的age进行赋值完成后形成的新的内存示意图如下 此时A实例的age值的变化是由test1方法引起的 5运行第4行根据此时的内存示意图输出test1方法中的age20 6运行第11行根据此时的内存示意图输出main方法中的age20 5对上述例子的改变 理解了上面的例子可能有人会问那么能不能让按照引用传递的值相互不影响呢就是test1方法里面的修改不影响到main方法里面呢 方法是在test1方法里面新new一个实例就可以了。改变成下面的例子其中第3行为新加的 [java] view plaincopy public class TempTest { private void test1(A a){ a new A();//新加的一行 a.age 20; System.out.println(test1方法中的agea.age); } public static void main(String[] args) { TempTest t new TempTest(); A a new A(); a.age 10; t.test1(a); System.out.println(”main方法中的age”a.age); } } class A{ public int age 0; } 运行结果为 [java] view plaincopy test1方法中的age20 main方法中的age10 为什么这次的运行结果和前面的例子不一样呢还是使用内存示意图来理解一下 6再次理解按引用传递 1运行开始运行第9行创建了一个A的实例内存分配示意如下 2运行第10行是修改A实例里面的age的值运行后内存分配示意如下 3运行第11行是把main方法中的变量a所引用的内存空间地址按引用传递给test1方法中的a变量。请注意这两个a变量是完全不同的不要被名称相同所蒙蔽。 内存分配示意如下 由于是按引用传递也就是传递的是内存空间的地址所以传递完成后形成的新的内存示意图如下 也就是说是两个变量都指向同一个空间。 4运行第3行为test1方法中的变量a重新生成了新的A实例的完成后形成的新的内存示意图如下 5运行第4行为test1方法中的变量a指向的新的A实例的age进行赋值完成后形成的新的内存示意图如下 注意这个时候test1方法中的变量a的age被改变而main方法中的是没有改变的。 6运行第5行根据此时的内存示意图输出test1方法中的age20 7运行第12行根据此时的内存示意图输出main方法中的age10 7说明 1“在Java里面参数传递都是按值传递”这句话的意思是按值传递是传递的值的拷贝按引用传递其实传递的是引用的地址值所以统称按值传递。 2在Java里面只有基本类型和按照下面这种定义方式的String是按值传递其它的都是按引用传递。就是直接使用双引号定义字符串方式String str “Java私塾”;