文档章节

Java中的值传递和引用传递

莫铭
 莫铭
发布于 2015/10/12 17:20
字数 659
阅读 38
收藏 1
点赞 0
评论 0

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

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
博文 50
码字总数 10909
作品 0
佛山
程序员

暂无文章

50 行 Python 代码,带你追到最心爱的人

程序员世纪难题 人们一提到程序员第一反应就是:我知道!他们工资很高啊!但大部分都是单身狗,不懂得幽默风趣,只是每天穿格子 polo 衫的宅男一个。甚至程序员自己也这样形容自己:钱多话少...

猫咪编程
6分钟前
0
0
JAVA知识点随心记

1.Switch case具体的支持类型? Q:支持byte、short、char、int基本类型,枚举类型和String类型(JDK7以上支持),四种基本类型的包装类型也支持,但是原因在于触发了自动拆箱,将包装类型拆成了基本...

勤奋的蚂蚁
17分钟前
0
0
NoSQL

一、NoSQL介绍 NoSQL属于非关系型数据,mysql属于关系型数据库。 对于关系型数据库来说,是需要把数据存储到库、表、行、字段里,查询的时候根据条件一行一行地去匹配,当数据量非常大的时候...

人在艹木中
22分钟前
0
0
第17章MySQL主从配置

mysql安装总结 mysql主从准备工作: 准备两台机器,每台机器安装msyql服务,并启动mysql服务 mysql详细安装 1.首先下载二进制免编译的包,下载到/usr/local/src/目录下 2.解压压缩包 3.解压完...

Linux学习笔记
26分钟前
0
0
Redis高可用及分片集群

一、主从复制 使用异步复制 一个服务器可以有多个从服务器 从服务器也可以有自己的从服务器 复制功能不会阻塞主服务器 可以通过服务功能来上主服务器免于持久化操作,由从服务器去执行持久化...

Java大蜗牛
29分钟前
0
0
前端面试题汇总

最近在复习,准备找工作了,特此总结一下前端的相关知识。 1.获取浏览器URL中查询字符的参数: function getQuery(name){    var reg = new RegExp("(^|&)"+name+"=([^&]*)"(&|$));...

凛冬来袭
今天
0
0
可持续发展的学习道路

与其要求别人,不如提升自己 内心渴望进步 经常做出改变现有模式,不断学习 寻找资源,整合资源,不断熟练这种模式 渠道很重要 先打开新世界的航路

狮子狗
今天
0
0
apollox-lua开源项目 示例codepen2

今天在示例上增加了几个功能, 首先添加js array的标准库。 所有js array的方法目前都支持了。 添加查看code模式。 点击查看code可以看到生成的lua代码。默认web模式需要把标准库连接进来, ...

钟元OSS
今天
0
0
javascript性能优化之避免重复工作

javascript最重要也最根本的性能优化标准之一是避免工作,避免工作又包括两点,第一,不做不必要的工作,第二,不做重复的已经完成的工作。第一部分可以通过代码重构完成,第二部分不做重复的...

老韭菜
今天
0
0
缓存穿透、并发和雪崩那些事

0 题记 缓存穿透、缓存并发和缓存雪崩是常见的由于并发量大而导致的缓存问题,本文讲解其产生原因和解决方案。 缓存穿透通常是由恶意攻击或者无意造成的;缓存并发是由设计不足造成的;缓存雪...

Java填坑之路
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部