文档章节

Java传值问题

那位先生_
 那位先生_
发布于 2013/08/31 09:28
字数 410
阅读 65
收藏 0

前几天看【深入Java虚拟机】的时候看见关于Java的传值和传引用的问题,书上说Java一直都是传值的,而所谓的传引用实际上传的是“引用的值”(不是引用所指向的值),所以换句话说还是传值。

然后自己就做了几个测试

我先写了一个测试类

<!-- lang: java -->
public class Test{

public static void main(String []args){
Integer a =5;
System.out.println(test(a));//6
System.out.println(a);//5
}

public static Integer test(Integer b){
    b++;
    return b;
}
}

开始我以为输出的都会是6,因为对于类来说传的都是“引用值”,就像下面的StringBuffer

<!-- lang: java -->
public class Test1{
public static void main(String []args){
StringBuffer sb=new StringBuffer("asdf");
System.out.println(test(sb));//asdfh
System.out.println(sb);//asdfg
public static StringBuffer test(StringBuffer sb){
sb.append("h");}}

Integer和StringBuffer同样都是一个类,为什么前者就没有“传引用”的效果而后者就有呢?

后来在Java吧里问了一下 大致得出了结论

首先,由基本数据类型封装得来的类都是final,像String ,Long ,Integer... 所以他们的引用对象是不可以改变的,但是可以改变值,但是String,Long,Integer等类并没有提供内部方法来修改 引用所“指向”的值,而对于+或++等操作都是把结果重新放进一个new对象里,所以在test方法中Integer会重新new一个对象来存放结果 而对于StringBuffer来说,append()方法则是StringBuffer类的方法,专门用来修改内部值的,所以调用append时 引用不会变,但是,引用所指向的值变了,所以就达到了“传引用”的效果

© 著作权归作者所有

共有 人打赏支持
那位先生_
粉丝 131
博文 59
码字总数 65305
作品 0
深圳
后端工程师
私信 提问
JVM基础:深入学习JVM堆与JVM栈

以前堆是干啥栈是干啥都知道,就是没连在一起想想。感觉讲的不错的一篇儿~~JVM栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;JVM堆解决的是数据存储的问题,即数据怎么放、放在...

李星
2014/06/04
0
0
SpringMVC之接收请求参数和页面传参

Spring接收请求参数 1,使用HttpServletRequest获取 Java代码 @RequestMapping("/login.do") public String login(HttpServletRequest request){ String name = request.getParameter("name")......

白志华
2015/09/23
0
0
一句话读懂Threadlocal

threadlocal是把ThreadLocal实例作为key,要保持的对象作为值,设置到当前线程的ThreadLocalMap 中。因此数据是保存在当前线程中的。 ThreadLocalMap实例是作为java.lang.Thread的成员变量存...

jeff_han
2015/11/18
0
0
java编程学习常见面试题及答案

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰
05/22
0
0
Java中的JVM基础:数据类型和堆栈

数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,...

疯狂的兔子
2015/03/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

windows10小鹤双拼注册表

《安全第一》直接发文本内容,自己建文本,改文本后缀reg。 使用方法: 1.复制下示文本内容,打开你的文本编辑器(#记事本notepad或其他++),粘贴文本内容并保存在任意位置(不影响使用) ...

漫步海边小路
5分钟前
0
0
一、数据挖掘

数据挖掘的发展动力---需要是发明之母 数据爆炸问题 自动数据收集工具和成熟的数据库技术使得大量的数据被收集,存储在数据库、数据仓库或其他信息库中以待分析。我们拥有丰富的数据,但却缺...

凯文加内特
8分钟前
0
0
Java线程池ThreadPoolExecutor

线程池 ThreadPoolExecutor 线程池是ExecutorService的实现,可以通过Executors执行工厂构造不同类型的执行服务(线程池)。 ThreadPoolExecutor线程池使用的是阻塞队列BlockingQueue。 用于...

器石_
9分钟前
0
0
Mybatis 实现SQL拦截并在控制台打印SQL和参数

注:可以拦截sql 执行时间,优化sql。并打印sql 以及参数 第一步:创建类: SqlPrintInterceptor 并实现 Interceptor 该类如下: package com.ra.common.plugin;import org.apache.ibati...

轻量级赤影
12分钟前
1
0
Log4j2 配置

config: <?xml version="1.0" encoding="UTF-8"?><!-- http://logging.apache.org/log4j/2.x/manual/appenders.html --><!-- status 负责打印日记系统的 WARN 级别以及以上的日记 --><C......

Credo-Zhao
12分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部