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

    Java总是在讨论是传递还是引用传递,Java没有像C语言那样拥有指针,在看到引用传递和值传递很多的解释之后,更相信引用传递和值传递归根到底都是值传递,只不过引用传递的时候看上去很高大上,其实是把变量的地址值,注意是地址值传递过去,赋值给其他的变量。


    看一个值传递的例子:

    package demo_pass;
    
    public class ValuePass {
        public static void main(String[] args) {
            ValuePass v = new ValuePass();
            int a=5;
            v.test(a);
            System.out.println("main中a的值:"+a);
        }
    
        public void test(int a) {
            a = 2;
            System.out.println("test中a的值:"+a);
        }
    }
    

    输出:

    test中a的值:2
    main中a的值:5

    通过idea的debug查看各个变量的赋值情况:


    在main方法中创建了一个对象,定义一个变量a并赋值5,这时候调用test方法,test方法传进去a,这时候传进去a的值是5,程序继续向下执行,

    在执行到12行的时候,12行的代码还没有执行,也就是没有进行赋值操作的时候,传进来的a的值还是5,当执行完12行的时候a的值变成了2,如下图:

    (这些变量的值也可以通过Expression和Watches看出)

    总结出来就是,这两个值是两个互不相关的值,在程序执行到这里的时候a的值传递过来,遇到赋值语句就改变了,如果把test方法中的赋值语句注释掉,a的值还是5,他们两个值是两个独立的值,互不相关,自己负责到自己的区域。特点:传递的是值的拷贝,传递之后就互不相关。


    引用传递:

    package demo_pass;
    
    public class ReferencePass {
        public static void main(String[] args) {
            ReferencePass rp = new ReferencePass();
            T t = new T();
            t.a = 4;
            rp.test(t);
            System.out.println("main方法中a的值:" + t.a);
        }
    
        public void test(T t) {
            t.a = 3;
            System.out.println("test方法中a的值:"+t.a);
        }
    }
    
    class T {
        public int a = 0;
    }

    执行结果:

    test方法中a的值:3
    main方法中a的值:3
    

    看创建的对象t的地址值,以及传进test方法的地址值都是一样的,此时对象t中a的值是4

    继续向下执行,我们看到在test方法中传递进去的对象t还是在main方法中创建的对象,在test方法中的小括号内只是声明了T,并没有创建对象,执行到test方法内的时候,对象t一直没有改变,在main方法中的赋值把a的值从创建对象初始化的时候的0变成了4,执行到test方法中,这个值又变成了3,也就是最开始指向4,后来把指向的内容换成了3,不再指向4,注意这个a一直是main方法中创建的对象t中的变量,所以,两个输出值都是3

    只要在test方法中添加创建对象的语句,输出结果就会改变

    package demo_pass;
    
    public class ReferencePass {
        public static void main(String[] args) {
            ReferencePass rp = new ReferencePass();
            T t = new T();
            t.a = 4;
            rp.test(t);
            System.out.println("main方法中a的值:" + t.a);
        }
        public void test(T t) {
            t = new T();
            t.a = 3;
            System.out.println("test方法中a的值:"+t.a);
        }
    }
    
    class T {
        public int a = 0;
    }

    输出;

    test方法中a的值:3
    main方法中a的值:4
    

    因为在test方法中创建了一个对象,这个对象是堆内存中一块新的区域,不是main方法中那个对象了,他们的变量没有任何的关系。


    如有不对,欢迎指正!

  • 相关阅读:
    谈谈一些有趣的CSS题目(十二)-- 你该知道的字体 font-family
    谈谈一些有趣的CSS题目(十一)-- reset.css 知多少?
    【Web动画】SVG 实现复杂线条动画
    【Web动画】SVG 线条动画入门
    引人瞩目的 CSS 变量(CSS Variable)
    谈谈一些有趣的CSS题目(十)-- 结构性伪类选择器
    ROW_NUMBER() OVER函数的基本用法
    PL SQL笔记(三)
    pushState、replaceState、onpopstate 实现Ajax页面的前进后退刷新
    无聊的人用JS实现了一个简单的打地鼠游戏
  • 原文地址:https://www.cnblogs.com/duzhentong/p/7816587.html
Copyright © 2011-2022 走看看