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

    package com.yanshu;
    
    /**
     * @author :yangyuanyuan
     * @description:TODO
     * @date :2021/1/25 13:47
     */
    class Person {
        private Integer id;
        private String personName;
    
        public Person(String personName) {
            this.personName = personName;
        }
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getPersonName() {
            return personName;
        }
    
        public void setPersonName(String personName) {
            this.personName = personName;
        }
    }
    public class TransferValueDemo {
    
        public void changeValue1(int age) {
            age = 30;
        }
    
        public void changeValue2(Person person) {
            person.setPersonName("XXXX");
        }
        public void changeValue3(String str) {
            str = "XXX";
        }
    
        public static void main(String[] args) {
            TransferValueDemo test = new TransferValueDemo();
    
            // 定义基本数据类型
            int age = 20;
            test.changeValue1(age);
            System.out.println("age ----" + age);
    
            // 实例化person类
            Person person = new Person("abc");
            test.changeValue2(person);
            System.out.println("personName-----" + person.getPersonName());
    
            // String
            String str = "abc";
            test.changeValue3(str);
            System.out.println("string-----" + str);
    
        }
    }

    运行结果:

    栈管运行,堆管存储

    CHANGEVALUE1的执行过程

    八种基本数据类型,在栈里面分配内存,属于值传递

    当们执行 changeValue1的时候,因为int是基本数据类型,所以传递的是int = 20这个值,相当于传递的是一个副本,main方法里面的age并没有改变,因此输出的结果 age还是20,属于值传递。

    CHANGEVALUE2的执行过程

    因为Person是属于对象,传递的是内存地址,当执行changeValue2的时候,会改变内存中的Person的值,属于引用传递,两个指针都是指向同一个地址

    CHANGEVALUE3的执行过程

    String不属于基本数据类型,但是为什么执行完成后,还是abc呢?

    这是因为String的特殊性,当我们执行String str = "abc"的时候,它会把 abc 放入常量池

    当我们执行changeValue3的时候,会重新新建一个xxx,并没有销毁abc,然后指向xxx,然后最后我们输出的是main中的引用,还是指向的abc,因此最后输出结果还是abc。

  • 相关阅读:
    Android 使用html做UI的方法js与java的相互调用
    WebRequest之HttpWebRequest实现服务器上文件的下载(一)
    使用Json比用string返回数据更友好,也更面向对象一些
    DES加密与解密在GET请求时解密失败的问题解决(终级)
    中大型系统架构组合之EF4.1+ASP.NET MVC+JQuery
    说说标准服务器架构(WWW+Image/CSS/JS+File+DB)
    inline内联函数和宏的区别
    [C语言]mac下Des CBC加密
    x264和FFMPEG 编译后遇到的一些问题:UINT64_C,
    关于多线程的那些事
  • 原文地址:https://www.cnblogs.com/qfdy123/p/14325072.html
Copyright © 2011-2022 走看看