• 引用传递和值传递


    明确一个概念: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 不是植物
    【转载文章务必保留出处和署名,谢谢!】
  • 相关阅读:
    从键盘输入一串数据,以“exit"结束输入,且输出数据。
    判断指定盘符下文件夹是否存在
    java 输出图形
    Object对象类
    java继承
    Java封装
    java环境搭建系列:JDK环境变量详细配置
    java环境搭建系列:JDK从下载安装到简单使用
    ORACLE常见错误代码的分析与解决
    Java与C++面向对象不同点
  • 原文地址:https://www.cnblogs.com/zhuziyu/p/8502992.html
Copyright © 2020-2023  润新知