文档章节

Java中的值传递和引用传递

莫铭
 莫铭
发布于 2015/10/12 17:20
字数 659
阅读 41
收藏 1

一、首先看一个比较容易混淆的例子

package com.example.String;

/**
 * Created by 390498 on 2015/10/12.
 */
public class Test2 {
    public static void main(String[] args){
        String a="原始值";//初始赋值
        System.out.println(a);
        change(a);//改值
        System.out.println(a);
    }

    /**
     * 改变字符串的值
     * @param a
     */
    private static void change(String a) {
        a = "已改变的值";
    }
}

输出结果:

原始值
原始值

相信初学者(也不乏部分学了几年JAVA的人)都会认为第十行代码change(a)应该改变了a的值,但实际上change方法并没有改变main方法中的a的值。这点正是本文要讨论的值传递引用传递

二、我们再看下何为值传递,何为引用传递。

    (1)值传递:在Java中,当基本类型(8大基本数据类型)作为参数传入方法时,无论该参数在方法内怎样改变,外部的变量原形总是不变;

    (2)引用传递:方法将非基本类型作为传入参数(对象类型的变量),方法改变参数变量的同时也会改变原型变量;

但是,相信部分读者也注意到,String类型并非基本数据类型,但是为什么按基本数据类型的方式进行处理了呢?其实,这个问题也正是后面我想谈谈的问题。

三、关于String(Integer、Float类似)参数传递问题所在

我们先看一下String类的部分实现:

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];

    /** Cache the hash code for the string */
    private int hash; // Default to 0

    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    private static final long serialVersionUID = -6849794470754667710L;

    /**
     * Initializes a newly created {@code String} object so that it represents
     * an empty character sequence.  Note that use of this constructor is
     * unnecessary since Strings are immutable.
     */
    public String() {
        this.value = new char[0];
    }

    /**
     * Initializes a newly created {@code String} object so that it represents
     * the same sequence of characters as the argument; in other words, the
     * newly created string is a copy of the argument string. Unless an
     * explicit copy of {@code original} is needed, use of this constructor is
     * unnecessary since Strings are immutable.
     *
     * @param  original
     *         A {@code String}
     */
    public String(String original) {
        this.value = original.value;
        this.hash = original.hash;
    }
    。。。。。。    
}

这里我们主要关注带参构造器,我们可以看到,new出来的String的存储形式是不可变的char数组,亦即String是char[]的包装类,而包装类的特征之一就是:在对其值进行操作时,会体现出其对应的基本类型的性质。所以,String类型作为参数类型进行传递的时候,体现出了基本数据类型的值传递的特征。


© 著作权归作者所有

共有 人打赏支持
莫铭
粉丝 13
博文 51
码字总数 11624
作品 0
佛山
后端工程师

暂无文章

Sqoop 操作实例补充

导入指定字段和指定条件的行记录 # 指定导入的字段--columns <col,col,col…># 指定过滤条件--where <where clause># 设置切分的工作单元--split-by <column-name># 目标目录存在...

PeakFang-BOK
22分钟前
2
0
App store 侵权投诉

App Store Content Dispute 侵权投诉 https://www.apple.com/legal/internet-services/itunes/appstorenotices/#?lang=zh...

壹峰
25分钟前
1
0
教程:如何在window上安装Apache HTTP Server

Apache官网只提供 Apache HTTP Server 的源代码,不提供编译好的二进制文件。 不过我们还是可以从网络上找到其他人编译好的Apache HTTP Server。 首先,从 https://www.apachehaus.com/cgi-b...

Doxde
42分钟前
1
0
中国移动蔡谦:5G传输准备就绪

目前5G已成业界热议话题,在即将到来的万物互联时代,5G是非常关键的技术。且5G相比4G,业务场景多种多样,对5G承载网带来巨大挑战。5G传输,承载先行并不仅仅是一个口号。当前5G承载网的部署...

linux-tao
50分钟前
4
0
维护“修理权”,苹果使用专有软件工具来修复MacBook Pro和iMac Pro

根据上月发给苹果授权服务提供商的一份文件,苹果公司正在使用新的专有软件诊断工具来修复MacBook Pros和iMac Pros,如果不用专有软件工具来修复关键部件,将会导致“系统失效和修复不完整”...

linuxCool
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部