zoukankan      html  css  js  c++  java
  • java传值问题.

    Java传递参数只有一种 :值传递 而没有引用传递

    一般根据传递类型来分类 可以分为 值类型数据 引用数据类型

    值类型是原始数据类型 包括 int,byte,char short long,boolean,float,double

    引用类型就是一般的class 当然也包括原始数据的封装类型 比如int

    封装类型为Integer

     

    比如对象的引用关系是这样的

     

    List list=new ArrayList();

     

    如上一段代码会产生两个对象 :引用对象(存在于栈中),实例对象(存在于堆中)

    引用对象的地址指向了实例化对象的地址,

    如果方法调用中传入的是引用对象才属于真正的引用传递 

    一般情况下 举个例子:

     

     


    public class TestJava {
    public static void add(TestJava java){
    java=new TestJava();
    }
    public static void main(String[] args) {
    TestJava java=null;
    add(java);
    System.out.println(java);
    }
    }

     

    输出结果 null

     

    其实可以这么去理解:

    调用方法时 同时也会产生一个引用对象,产生的新引用对象 同时也指向实例对象 public static void add(TestJava java) 相当于该方法中的TestJava java

    在方法中 新的引用地址指向了一个新创建的对象 ,而旧的

    java=new TestJava();  里面的java 还是指向的null对象  所以方法传递的时候 实际是传递实例化对象和创建了一个新的引用,而不是旧的引用对象的传递所以不属于 引用传递

     

     

     

     看下面的例子 

     

    public class TestJava {

    String name=null;
    public static void add(TestJava java1){
    java1.name="liaomin";
    }
    public static void main(String[] args) {
      TestJava java=new TestJava();

    java.name="huqun";
    add(java);
    System.out.println(java);
    }
    }

     

    输出结果 liaomin

     

    上面的例子 可以进一步确认上面的观点

     

    TestJava java=new TestJava();

    创建了一个引用对象 和一有个实例化对象

    引用对象指向了 实例对象

     

    public static void add(TestJava java1)

    创建了一个新引用对象

    add(java);

    调用的时候 同时java1引用对象指向了实例化对象

    java1.name="liaomin";

    改变了 java1的值 实际上是改变了实例化对象的值

     

    Java引用对象也是指向了 实例化对象 所以他的值

    也会改变

     

    如果觉得理由在不充分 在在看下面的例子 

     

     

     看下面的例子 

     

    public class TestJava {

    String name=null;
    public static void add(TestJava java1){

    Java1=new TestJava();
    java1.name="liaomin";
    }
    public static void main(String[] args) {
      TestJava java=new TestJava();

    java.name="huqun";
    add(java);
    System.out.println(java);
    }
    }

     

    输出结果 huqun;

     

     

     TestJava java=new TestJava();

    创建了一个引用对象java 和一有个实例化对象 new TestJava()

    引用对象指向了 实例对象

     

    public static void add(TestJava java1)

    创建了一个新引用对象

    add(java);

    调用的时候 同时java1引用对象指向了实例化对象

    Java1=new TestJava();

    Java1指向了 新创建的实例化对象

    java1.name="liaomin";

    改变了 java1的值 实际上是改变了新实例化对象的值,而不是改变

    的旧的实例化对象 因为他指向了别人

     

    Java引用对象也是指向的是以前实例化对象 所以他的值

    不会改变

     

     

     

    常量类型的引用

     

    public class TestJava {

        public static void add(Integer inte){

           inte=2;

        }

        public static void main(String[] args) {

           Integer in=new Integer(1);

           add(in);

           System.out.println(in);

        }

    }

     

    任何原始数据类型及原始数据类型的封装类 作为参数传递时

    无论怎么在方法中修改都不会影响原始的值 ,因为在传递时

    传递的对象的常量值 而不是 地址了 所以不会改变,可以理解

    为实例化对象在堆内存中储存的常量值 而不是地址

     

    比如 Integer it=new Integer(3);

    栈内存中放的是 it地址 对内存中放的是 3

    It地址指向的是3

     

     

    看一下 String 问题

     

    public class TestJava {

     

        public static void main(String[] args) {

           String a="234";

           String b=new String("234");

           String c="234";

           System.out.println(a==b);

           System.out.println(c==b);

           System.out.println(a==c);

        }

    }

     

     

    a="234"; 

    b=”234”

    a==b比较地址  地址绝对是一样的 比较的是实例化对象的地址 而不是引用的地址

     

    b=”234” 首先去查看一下 堆内存中是否有 “234”这个常量 如果有 则指向该地址

    没有就创建一片地址

     

    C=new String(“234”) 很明显重新开辟了一片心地址  和上面的都不相等

     

     

     

     

     

  • 相关阅读:
    帝国 标签模板 使用程序代码 去除html标记 并 截取字符串
    iis6 伪静态 iis配置方法 【图解】
    您来自的链接不存在 帝国CMS
    帝国cms Warning: Cannot modify header information headers already sent by...错误【解决方法】
    .fr域名注册 51元注册.fr域名
    帝国网站管理系统 恢复栏目目录 建立目录不成功!请检查目录权限 Godaddy Windows 主机
    星外虚拟主机管理平台 开通数据库 出现Microsoft OLE DB Provider for SQL Server 错误 '8004' 从字符串向 datetime 转换失败
    ASP.NET 自定义控件学习研究
    CSS层叠样式表之CSS解析机制的优先级
    ASP.NET程序员工作面试网络收藏夹
  • 原文地址:https://www.cnblogs.com/liaomin416100569/p/9332114.html
Copyright © 2011-2022 走看看