最近一个朋友问起我一道这样的题目
public class Test{
public static void change(String str){
str="123";
}
public static void main(String[] args){
String word="abc";
change(word);
System.out.println(word);
}
}
这个输出的结果是什么?
我想了下,String是对象,word指向的是JVM中String常量池中"abc"对象,随口一答:123.
结果错了,回想起来这样的JAVA基础问题都回答了真是汗颜.
这几天仔细思考了下,把我这几天想的写下来,
如果有错请大家拍砖.
要了解方法传参是传值还是传引用,我们首先要了解JAVA中对方法的处理过程:
当调用一个方法时,JAVA中会为这个方法专门开辟一个方法内存块,并实例化所有的局部变量(
这就是局部变量能保证线程安全的本质所在).
而方法的传入参数则会以以下方式来处理,以上面例子来说明:
当上面的main方法调用chang(String str);函数时,程序实际上在做这样的事情:
1.change(word);
把"abc"引用传给change方法,change方法被JVM分配方法内存块
2.String str=word;
change方法内存快被开辟后,在栈中开辟一个str,"abc"的引用就被赋予入参str,这时可以明显的分析出word与str已经毫无关系
3.str="123";
这时候只是把str的引用指向了"123"
从这段分析可以得出我们想要的结果.
对于基本类型都是按值传递的,是值之间的COPY,所以答案显而一见.
但是对于对象类型的入参是怎么样呢?
public class RefTest{
public static void changeUser(User user){
user=new User();
user.setName("none");
}
public static void changeUserName(User user){
user.setName("showtime");
}
public static void main(String[] args){
User userMain=new User();
userMain.setName("lan");
changeUserName(userMain);
System.out.println(userMain.getName());
changeUser(userMain);
System.out.println(userMain.getName());
}
}
class User{
private String name;
public void setName(){
this.name=name;
}
public String getName(){
return this.name;
}
}
读懂了上面的关于String的同学,我相信对于方法changeUser肯定会得出正确答案:不会更改对象.
但是对于changeUserName()这个方法会不会呢?
我们继续分析,
1.changeUser(user);
把user引用传给changeUser方法,change方法被JVM分配方法内存块
2.String str=word;
changeUser方法内存快被开辟后,在栈中开辟一个user,main方法中的userMain的引用就被赋予入参user
3.关键一步来了,user.setName("showtime");
第2步中说了把userMain对象的引用给了user,所以说当调用对象的方法的时候是起作用的,名字最后会被更改为showtime.
后记:这是第一次在JAVAEYE上发一个自己写的东西,先从容易的下手,呵呵,希望大家支持我,看完了记得顶我.我会给大家带来更多我的思考与经验.
分享到:
相关推荐
"java中传值还是传引用的认识" Java 中的参数传递是值传递还是引用传递?这是一个经常引发讨论的问题。在 Java 中,参数传递是按值传递的,也就是说,传递给方法的参数是一个副本,而不是原始值本身。 当一个对象...
在Java编程语言中,函数调用时的参数传递方式有两种:传值(Passing by Value)和传引用(Passing by Reference)。虽然Java官方文档中并未明确指出有传引用这一概念,但在实际操作中,Java的行为类似于传引用,尤其...
### Java是传值还是传址引用 #### 一、简单类型是按值传递的 Java在处理简单数据类型(如int、boolean等)时采用的是按值传递的方式。这意味着当你将一个简单类型的值作为参数传递给一个方法时,实际上传递的是这...
根据标题和描述,我们将深入探讨Java中传值与引用的区别,以及它们在实际编程中的应用。 首先,Java是一种“总是按值传递”的语言。这意味着无论是基本类型还是引用类型,当作为参数传递时,都会有一个副本被创建并...
"Java中的传值与传引用实现过程解析" Java中的传值与传引用是Java编程语言中的一种基础概念,它们是Java函数中参数传递的两种方式。 Java中的传值是指函数参数的值被复制到函数内部,在函数内部对参数的修改不会...
"lotus domnio java代理传值"这个主题主要涉及如何在Java代码中创建和使用代理,并在代理之间传递参数。 首先,让我们了解一下Lotus Domino Java代理的基本概念。在Lotus Domino Designer中,Java代理是用Java语言...
Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE程序 界面传值问题Java SE...
### Java传值中的乱码问题及最简易的解决方法 在Java Web开发中,经常会遇到一个令人头疼的问题:客户端向服务器传递数据时出现乱码。这种情况不仅会影响用户体验,还可能导致程序逻辑错误。本文将深入探讨Java传值...
在Java编程语言中,引用类型变量实际上是对象的引用或指针,而非对象本身。当我们讨论“引用类型传值”时,意味着在方法调用时,传递的是对象引用的一个副本,而不是对象本身。以下是对给定代码清单的详细解释: 1....
在Java中,数据类型分为基本数据类型和引用数据类型。基本数据类型包括布尔型(boolean)、字节型(byte)、短整型(short)、整型(int)、长整型(long)、字符型(char)、单精度浮点型(float)、双精度浮点型...
例如,在C++或Java等语言中,基本类型的参数传递就是传值。这种机制保证了函数内部的修改不会对外部环境产生副作用,但同时也意味着无法直接通过形参改变实参的值。 其次,**传名**(也称为传引用)的概念。在某些...
本文将深入探讨Struts2中两种不同的传值方式,并结合实例解析如何在JSP页面中使用Struts2标签进行数据访问。 首先,传值问题在Struts2中主要涉及到Action类和JSP页面之间的交互。在Action类中,有两种方式可以将值...
这个标题所指的"Java中GET表单传值分页搜索功能"涉及了以下几个核心知识点: 1. **GET请求**:GET是HTTP协议中的一个方法,用于请求访问已经被URI(统一资源标识符)识别的资源。在Web应用中,GET请求通常用于获取...
在JavaScript和Java中,处理URL参数,特别是涉及到中文字符时,需要特别关注编码和解码的问题。本主题将深入探讨“jsurl传值”与“java页面url传值中文编码&解码”的相关知识点。 首先,我们要了解URL编码。URL编码...
本文将通过一个具体的例子来深入探讨Java中的传值与传引用的区别,并解释如何利用这一特性来更好地管理程序的状态。 #### 1. 传值与传引用的概念 在Java中,基本数据类型(如int、char等)的参数传递遵循“传值”...
在Web开发中,JavaServer Pages (JSP) 和 Java Servlets 是常见的技术组合,用于构建动态、交互式的网页。在本场景中,我们探讨的是如何使用JSP通过Ajax(Asynchronous JavaScript and XML)发送JSON(JavaScript ...
让我们深入分析Java中的传值调用,特别是涉及到对象的情况。在Java中,对象是通过引用进行操作的。这里的"引用"并不是像C++中的引用那样,它更像是C++中的指针,但有一些关键的区别。当我们创建一个对象并赋值给一个...
在IT行业中,页面传值与后台传值是Web开发中的基础技能,特别是在使用Java进行后端处理时。这里我们将深入探讨这两个概念,并结合标签“jsp”和“json”,阐述它们在实际开发中的应用。 首先,页面传值指的是前端...