`
flyfoxs
  • 浏览: 294794 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

JAVA函数可以修改传入的变量吗?

    博客分类:
  • JAVA
 
阅读更多

泛泛的谈,可以说,有时可以有时不可以. 那我们就具体些,直入主题,看疗效吧.下面是一个例子:

 

import java.util.LinkedList;
import java.util.List;

public class Api {
	public static final void main(String[] args) {
		int tmp = 10;
		change(tmp);
		//可以看到,传入的temp没有被修改掉
		System.out.println(tmp);

		List<Integer> list = new LinkedList<Integer>();
		change(list);
		//可以看出,传入的List被修改了,之前大小是0,现在打印结果是1
		System.out.println("size=" + list.size());
	}

	public static void change(int tmp) {
		tmp = tmp * 2;
	}

	public static void change(final List<Integer> list) {
		list.add(1);
	}

}

 

 

 

实际上,上面这个问题和这个问题是一个问题"JAVA函数传递的是值,还是引用"

JAVA传递的是值,只不过这个值的Value是变量的引用.

 

change(int tmp)之所以没有修改传入的值,是因为Integer是不可变对象,不能直接修改Integer的值,只能生成一个新的对象然后指向它.这样函数里面的临时变量和传入的变量值(引用)已经不一样了

 

 

change(final List<Integer> list) 里面的值之所以被修改了,是因为参数出入的值是引用,引用没有变,但是引用的对象变了.由于引用的对象变了,所有指向这个对象的变量当然也就变了.

 

 

细心的你可能已经发现,change(int tmp)这个参数不能添加final.

如果添加就是代表tmp不能修改为别的对象,而change(final List<Integer> list)却可以. 原因也是一样的:

change(int tmp):在函数的内容中,我们会对tmp进行修改,导致tmp指向不同对象,如果声明为final则修改处会出现语法错误.

 

change(final List<Integer> list):虽然final修饰后不能修改为别的对象,但是对象里面的内容是可以修改的.

 

 

 

 

3
2
分享到:
评论
8 楼 white_crucifix 2014-05-28  
楼主的思想是对的,但是弄浑了int Integer的关系。change(int)传入的是int,而不是Integer,仅有int计算的过程是不会装箱解箱成Integer的。而int不存在引用不引用,因为都是在栈上发生的行为。事实上,一进入方法,里面的世界就与外面无关了,值都给进来了,外面的int对里面的世界来说已经毫无利用价值。当方法结束,栈上变量全部出栈,里面的世界崩塌。外面的int还活的好好的,继续着自己的人生。
7 楼 ys527663232 2014-05-28  
请问string类型的如何?
6 楼 mfkvfn 2014-05-28  
基础知识。简单地说就是:
1 简单类型参数是值传递,对象参数是引用传递。值传递的不可以修改原实参的值,引用传递的可以改变原实参的值。
2 final作用于变量或参数上时,如果是基本类型变量或参数,则不可以修改变量的值。如果是非基本类型变量或参数时,仅表示指针不可以修改,但是可以修改对象里的状态。
3 String是特例,把它当作与int/boolean等基本类型一样看待。
5 楼 freezingsky 2014-05-27  
重新把java引用那一章再仔细看看!
4 楼 flyfoxs 2014-05-27  
奔三的小生 写道
推荐楼主把 JLS -- java语言规范看一遍


是我哪理解错了吗? 请指出
3 楼 奔三的小生 2014-05-27  
推荐楼主把 JLS -- java语言规范看一遍
2 楼 风云无浪 2014-05-27  
arsemilan 写道
类加final表示引用不可变,但是内容可变

类加final表示不可被继承。
另外final加参数里不会影响赋值,不管加不加final,list都不会指向别的数组,list都可以add。final参数是为了避免参数被误改变
change(List<Integer> list){list.add(3);list= new ArrayList<Integer>();}函数执行后,list里是有3的。
JAVA的函数传递的是list的地址作为形参,形参的地址改变不会影响实参,所以重新=new ArrayList<Integer>不会改变。函数里的读取是直接调用地址指向实参内容,所以add之类的操作会改变内容。

1 楼 arsemilan 2014-05-27  
类加final表示引用不可变,但是内容可变

相关推荐

    Java怎么在函数内改变传入的值

     函数调用时,参数传递的方式主要有两种: 值传递和引用传递。  Java使用的是值传递。值传递是把变量的值、常数或常量传递给参数。而引用传递,是把变量的所在内存中的地址传递给参数,参数通过地址找

    JAVA泛型加减乘除

    这是一个使用JAVA实现的泛型编程,分为两部分,第一部分创建泛型类,并实例化泛型对象,得出相加结果。 第二部分用户自行输入0--4,选择要进行的加减乘除运算或退出,再输入要进行运算的两个数,并返回运算结果及...

    python-16-函数式编程和高阶函数.zip

    函数是 Python 内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的 函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。 函数就是面向过程的程序设计的基本单元。 ...

    JNI技术手册 c/c++调用java

    2) 如何将java传入的String参数转换为c的char*,然后使用? 57 3) 将c中获取的一个char*的buffer传递给java? 57 4) 不知道占用多少空间的buffer,如何传递出去呢? 58 五、 对JAVA传入数据的处理 58 1) 如果传入的是...

    python基础2day05.txt

    函数本身可以赋值给变量,赋值后变量绑定函数 允许将函数本身作为参数传入另一个函数 允许返回一个函数 函数的可重入性: 可重入是指一个函数传的参数一定,则结果必须一定 要求: def定义的函数不要访问除...

    Json-RPC for java中文手册

    编程,就可以通过javascript调用被注册的java对象并返回java对象,如果被返回的对象 还有方法,这个在javascript中返回的java对象的变量,你还可以继续调用它的方法.....这就是这个轻 量级json-rpc-for-java的神奇之...

    经典php入门学习提纲

    php的基本语法和c/c++,java的差不多,只是php在定义变量时没有要显示声明变量类型,php对变量的...所以在函数中可以根据不同情况返回不同类型的值,以及可以向函数传入不定数量的参数,这一点像c/c++,java是做不到的

    javascript自执行函数

    通过定义一个匿名函数,创建了一个“私有”的命名空间,该命名空间的变量和方法,不会破坏全局的命名空间。这点非常有用也是一个 JS 框架必须支持的功能,jQuery 被应用在成千上万的 JavaScript 程序中,必须确保 ...

    javascript中eval函数用法分析

    本文实例分析了javascript中eval函数用法。分享给大家供大家参考。...最为重要的是,它使用了调用它的变量作用域环境,即它查找变量的值和定义新变量和函数的操作和局部作用域的代码完全一样。 eval(va

    详解javascript函数的参数

    1.Js函数可以传入不同的参数,如 function writeNString(strMsg){ [removed](strMsg + " "); } 2.Js函数返回值,js函数可以将运行的结果返回,函数可以视为一个黑盒子,使用参数输入数据后产生所需的运行结果,...

    基于某JAVA地剪刀石头布游戏设计——Java课程设计报告材料-.doc

    派生类可以从它的基类那里继承方法和变量 , 并且类可以修改或增加新的方法使之更适合特殊的需要。 在一个程序中,这些独立运行的程序片断叫作"线程〞〔Thread〕,利用它编程的概 念就叫作"多线程处理〞 【3】。多...

    基于JAVA的剪刀石头布游戏设计.docx

    派生类可以从它的基类那里继承方法和变量, 并且类可以修改或增加新的方法使之更适合特殊的需要。 在一个程序中,这些独立运行的程序片断叫作"线程"(Thread),利用它编程的概念就叫作"多线程处理" 。多线程处理一...

    C语言是最好的语言,除了java之外的.zip

    为了实现这个移动,函数将数组的第一个元素存储在变量array_element中,并将数组中的其他元素向左移动一个位置。 然后,将array_element存储在数组的最后一个元素中,这样,数组中的元素就会向左移动一个位置。 重复...

    【05-面向对象(下)】

    •使用final修饰局部变量时既可以在定义时指定默认值,也可以不指定默认值。 •给局部变量赋初始值,只能一次,不能重复。 final修饰基本类型和引用类型 •当使用final修饰基本数据类型时,不能对其重新...

    Lua解析器mLua.zip

    方法名称方法解释setBasedir(String)设置lua代码的最外层目录,所有lua代码都应该存放在这个目录或其子目录下pushGlobal(String, Object)设置全局lua的全局变量或函数,可以push普通的Object,或者JavaFunction。...

    关于javascript函数的几个话题

    ()运算符作用于一个函数指针将会执行它所在的函数,当然还会传入参数。 2.函数直接量(函数文字量) 实际上函数直接量这个说法并不准确 但可以通俗地解释一些用法 125 “good”是都是直接量 可以在

    复杂邮件程序完整Java源码,支持添加附件,图片,HTML格式文本,支持远程WebService调用

    * initialization 实例化类成员变量 */ private void initialization(String sender, String addressee, String subject, String text) { this.sender = sender; this.addressee = addressee; this.subject = ...

    javascript函数重载解决方案分享

    JS的函数定义可以指定形式参数名称,多多少少我们会以为js至少可以支持参数个数不同的方法重载,然而遗憾的是这仅仅是一个假象,js所有的参数都是以arguments传递过去的,这个参数类似于数组,在函数调用的时候,...

    阿里巴巴编码规范 基础技能认证 考题分析(考题+答案).docx

    魔法值是指程序中随意定义并赋值的变量值,如果代码编写者明白变量值意义是可以任意使用的,例如在代码中写if(status == 3) return error;符合规范。 C .如果变量值仅在一个范围内变化推荐用Enum类。 D .在程序...

Global site tag (gtag.js) - Google Analytics