zoukankan      html  css  js  c++  java
  • Java的值传递和引用传递

    首先来看一段代码:

    User类:

     1 public class User {
     2     private String name;
     3 
     4     public String getName() {
     5         return name;
     6     }
     7 
     8     public void setName(String name) {
     9         this.name = name;
    10     }
    11 
    12 }

    测试类:

    1 public class Demo1 {
    2     public static void main(String[] args) {
    3         User user=new User();
    4         List<User> list=new ArrayList<User>();
    5         list.add(user);
    6         user.setName("李四");
    7         System.out.println(list.get(0).getName());
    8     }
    9 }

    大家根据自己的理解来得到自己认为输出的结果,看看和接下来打印出的结果是否一致。

    程序运行结果:

    这儿,就要讲到java中的值传递和引用传递概念了:

    值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。

    引用传递:(形式参数类型是引用数据类型参数):也称为传地址。方法调用时,实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法执行中形式参数的改变将会影响实际参数。

    根据上面的概念,我们一起来写几个demo来真正体会java中的值传递和引用传递区别:

    按值传递:指的是在方法调用时,传递的参数是按值的拷贝传递。demo:

     1 public class TempTest {
     2     private void test1(int a){
     3         //做点事情
     4     }
     5     public static void main(String[] args) {
     6         TempTest t = new TempTest();
     7         int a = 3;
     8         t.test1(a);//这里传递的参数a就是按值传递
     9     }
    10 }
    11             

    按值传递重要特点:传递的是值的拷贝,也就是说传递后就互不相关了。demo:

     1 public class TempTest {
     2     private void test1(int a){
     3         a = 5;
     4         System.out.println("test1方法中的a="+a);
     5     }
     6     public static void main(String[] args) {
     7         TempTest t = new TempTest();
     8         int a = 3;
     9         t.test1(a);//传递后,test1方法对变量值的改变不影响这里的a
    10         System.out.println(”main方法中的a=”+a);
    11     }
    12 }
    13                     

    运行结果是:

    按引用传递:指的是在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。demo:

     1 public class TempTest {
     2     private void test1(A a){
     3     }
     4     public static void main(String[] args) {
     5         TempTest t = new TempTest();
     6         A a = new A();
     7         t.test1(a); //这里传递的参数a就是按引用传递
     8     }
     9 }
    10 class A{
    11     public int age = 0;
    12 }

    按引用传递的重要特点是传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)。demo:

     1  public class TempTest {
     2      private void test1(A a){
     3          a.age = 20;
     4          System.out.println("test1方法中的age="+a.age);
     5      }
     6      public static void main(String[] args) {
     7          TempTest t = new TempTest();
     8          A a = new A();
     9          a.age = 10;
    10          t.test1(a);
    11          System.out.println(”main方法中的age=”+a.age);
    12      }
    13  }
    14  class A{
    15      public int age = 0;
    16  }

    运行结果是:

    相信大家看了上面的例子和说明,已经对值传递和引用传递有了进一步的认识,最后再总结一下!

    说明:

    (1):“在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递。

    (2):在Java里面只有基本类型和按照下面这种定义方式的String是按值传递,其它的都是按引用传递。就是直接使用双引号定义字符串方式:String str = “Java私塾”;

  • 相关阅读:
    HDU 3681 Prison Break 越狱(状压DP,变形)
    POJ 2411 Mondriaan's Dream (状压DP,骨牌覆盖,经典)
    ZOJ 3471 Most Powerful (状压DP,经典)
    POJ 2288 Islands and Bridges (状压DP,变形)
    HDU 3001 Travelling (状压DP,3进制)
    POJ 3311 Hie with the Pie (状压DP)
    POJ 1185 炮兵阵地 (状压DP,轮廓线DP)
    FZU 2204 7
    POJ 3254 Corn Fields (状压DP,轮廓线DP)
    ZOJ 3494 BCD Code (数位DP,AC自动机)
  • 原文地址:https://www.cnblogs.com/tobey/p/4821936.html
Copyright © 2011-2022 走看看