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。

  • 相关阅读:
    shell脚本学习001
    Discuz 代码分析 001 forum.php
    Oauth2.0 入门
    第一篇文章
    position的四个属性值: relative ,absolute ,fixed,static
    JQuery中stop([clearQueue],[goToEnd])介绍
    <meta>
    sublime 2中Package control安装和使用
    ios 状态码
    <video>和<audio>标签,对视频和音频的支持
  • 原文地址:https://www.cnblogs.com/qfdy123/p/14325072.html
Copyright © 2011-2022 走看看