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

    明确一个概念:JAVA中分为基本数据类型及引用数据类型

    JAVA基本数据类型:byte,short,int,long,float,double,char,boolean.

    一、变量的基本类型和引用类型区别

    (1)基本数据类型在声明时系统就给它分配空间

    (2)引用数据类型声明时只给变量分配了引用空间,而不分配数据空间

    编译器给的报错信息:

    二、引用传递和值传递

    值传递:操作的实际上是原始值的一个copy,并不会影响原来的值

    引用传递:方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,函数接收的是原始值的内存地址

     1 public class o1 {
     2     public int b=49;
     3 }
     4 
     5 
     6 public class t1 {
     7     public static void main(String[] args) { 
     8         t1 t = new t1(); 
     9         int a=99; 
    10         t.test1(a);//这里传递的参数a就是按值传递 
    11         System.out.println(a);
    12          
    13         o1 obj=new o1(); 
    14         t.test2(obj);//这里传递的参数obj就是引用传递
    15         System.out.println(obj.b);
    16     } 
    17      
    18     public void test1(int a){ 
    19         a=a+1;
    20         System.out.println("test1:"+a);
    21         } 
    22      
    23     public void test2(o1 obj){ 
    24         obj.b=50;
    25         System.out.println("test2:"+obj.b);
    26         }
    27 }

    结果:

    因为int是基本类型,值传递,所以值没有改变

    object是引用类型,引用传递,值发生改变

    注意:这里要特殊考虑String,以及Integer、Double等几个基本类型包装类,它们都是值传递

     1 public class t1 {
     2     public static void main(String[] args){
     3         t1 pk=new t1();
     4         //String类似基本类型,值传递,不会改变实际参数的值
     5         String test1="Hello";
     6         pk.change(test1);
     7         System.out.println(test1);
     8          
     9         //StringBuffer和StringBuilder等是引用传递
    10         StringBuffer test2=new StringBuffer("Hello");
    11         pk.change(test2);
    12          
    13         System.out.println(test2.toString());
    14     }
    15      
    16     public void change(String str){
    17         str=str+"world";
    18     }
    19      
    20     public void change(StringBuffer str){
    21         str.append("world");
    22     }
    23 }

    结果:

    总结:

    (1)基本数据类型传值,对形参的修改不会影响实参;
    (2)引用类型传引用,形参和实参指向同一个内存地址(同一个对象),所以对参数的修改会影响到实际的对象;
    (3)String, Integer, Double等immutable的类型特殊处理,可以理解为传值,最后的操作不会修改实参对象。

    博客园:http://www.cnblogs.com/zhuziyu/
    Copyright ©2018 不是植物
    【转载文章务必保留出处和署名,谢谢!】
  • 相关阅读:
    结合使用allure当中的方法 让用例执行结果内 显示详细描述信息
    pytest-repeat插件,指定用例重复运行、重复运行次数
    pytest-xdist 分布式执行用例
    token
    使用pytest-ordering 来自定义用例执行顺序
    用例编写规则、命令行执行用例、用例执行的先后顺序
    python 中的doctest单元测试框架
    pytest 对用例mark标记分类(且用例也可按照分类来执行)
    学习webpack基本配置(一)
    (剑指offer)数组中出现次数超过一半的数字
  • 原文地址:https://www.cnblogs.com/zhuziyu/p/8502992.html
Copyright © 2011-2022 走看看