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 不是植物
    【转载文章务必保留出处和署名,谢谢!】
  • 相关阅读:
    其他内容
    html标签
    ambari安装集群下安装kafka manager
    greenplum-cc-web4.0监控安装
    ambari安装集群下python连接hbase之安装thrift
    hadoop运维问题记录
    Ambari2.6.0 安装HDP2.6.3(离线安装)
    mongodb 定时备份
    linux top命令详解
    Sublime Text3配置Python环境
  • 原文地址:https://www.cnblogs.com/zhuziyu/p/8502992.html
Copyright © 2011-2022 走看看