`
flyfoxs
  • 浏览: 298132 次
  • 性别: 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函数语言大全”可能引起了一些误解,实际上,描述中提到的是“C语言函数大全”,所以我们将重点讨论C语言的函数相关知识。 在编程语言中,函数是执行特定任务的可重用代码块。C语言作为基础且强大...

    java函数讲解

    ### Java函数详解 #### 一、函数的基本概念 ...通过以上介绍,我们可以看到Java函数的强大功能及其在实际开发中的重要作用。合理地使用函数不仅可以提高代码的可读性和可维护性,还可以有效地提升开发效率。

    java函数速查中文版

    4. **变量args**:在方法签名中,使用`...`操作符可以创建一个可变长度的参数列表,这样你就可以传入任意数量的相同类型的参数。例如,`public void printNumbers(int... numbers)` 方法可以接受零个或多个整数。 5...

    java实现eval函数

    在Java编程语言中,`eval`函数通常与JavaScript关联,因为JavaScript有一个内置的`eval`函数,它能够解析并执行一个字符串作为JavaScript代码。然而,Java本身并不直接提供类似的功能。`eval`函数在Java中并不是标准...

    Java中两个非常特殊的变量:this和super

    在这段代码中,`this`使得构造函数能够正确地将传入的参数赋值给相应的成员变量,而不是覆盖它们。此外,`this`还可以用于调用当前对象的其他方法或属性,例如,如果有一个`displayInfo()`方法,可以使用`this....

    java 中函数的参数传递详细介绍

    在Java编程语言中,函数参数传递机制是一个关键概念,它涉及到如何在方法内部操作传入的参数。根据Java的特性,参数传递分为两种主要类型:值传递和引用传递。下面我们将详细探讨这两种传递方式以及它们在不同数据...

    JAVA泛型加减乘除

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

    java试验,random函数调用等

    在"java试验,random函数调用等问题"中,我们可能涉及以下几个关键知识点: 1. **Random类的创建**: 在Java中,我们首先需要通过`new Random()`来实例化一个`Random`对象,然后才能调用它的方法来生成随机数。...

    参数传递的总结——构造函数

    2. **引用传递**:通过引用传递参数,构造函数可以直接访问并修改调用者提供的变量。这在需要改变对象状态或避免不必要的拷贝时非常有用。在C++中,可以使用`&`符号来声明引用参数。例如,`void foo(MyClass& obj)`...

    Java泛型构造函数(学习资料)

    此外,我们还可以定义一个泛型构造函数,比如`GenericEntry(T data, int rank)`,它接受一个泛型参数`T`,并将其存储到类的成员变量`data`中。 4. **泛型构造函数的优势** - **类型安全**:通过泛型,编译器可以在...

    DELPHI 7 调用 JAVA 接口

    6. **传递参数和接收结果**:在Delphi中,你可以使用上述函数,传入Java接口名、方法名以及参数,调用Java方法并获取返回值。 ```delphi const ClassName = 'com/example/MyJavaClass'; MethodName = '...

    第06章函数 (2).pptx

    函数内部可以访问全局变量,如`PER_PRICE_1`和`NUMBER_1`,但若在函数内部修改全局变量,需要使用`global`关键字。如果不使用`global`,在函数内部对全局变量的修改实际上是创建了一个局部变量,这可能导致预期外的...

    JNA 转java接口以及指针结构体解析

    Java Native Access(JNA)是Java平台上的一个库,它允许Java代码直接调用本地(操作系统级别的)函数,而无需编写任何JNI(Java Native Interface)代码。JNA通过提供一个映射机制,将Java方法与C/C++函数相对应,...

    JAVA反射机制的入门代码

    Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法...

    java变量和javascript变量之间的传递示例

    在进行Web开发时,尤其是使用JSP技术开发动态网站时,我们常常需要处理服务器端Java变量与客户端JavaScript变量之间的数据交互问题。JSP(JavaServer Pages)是一种用于开发动态网页的技术,它允许我们在HTML页面中...

    Java中的函数.pdf

    在日志函数中使用`log.log()`并传入格式化的字符串和对象数组,可以减少字符串连接的开销,尤其是在循环中。 接着,我们来看Java 8引入的新特性——函数式编程。函数式编程的核心概念是将函数作为一等公民,允许将...

    Core.Java基础教程 .Java编程语言基础-对象定义、变量与值传递

    在Java中,基本类型(如int, double)是按值传递,意味着传入函数的是变量的副本,而对象引用是按引用传递,传递的是对象在内存中的地址,而不是对象本身。 3. **封装**: 封装是面向对象编程的一个核心原则,它...

    Java Interview Questions.pdf

    构造器重载是指在同一个类中定义多个具有相同名称但参数列表不同的构造器,这样可以根据传入的参数类型和数量来创建不同的对象实例。 14. **解释什么是多态性(Polymorphism)** 多态性是面向对象编程的重要特性...

Global site tag (gtag.js) - Google Analytics