JAVA语言的参数传递: 再一次感慨:java只有值传递 ,之所以有引用传递的假象是由于java中的对象,是通过引用操控的。下面是一个证明java参数是值传递而不是引用传递的一个例子:
public class Test {
public static void exchangeString( String parameterStrA , String parameterStrB )
{
//交换前输出两个形参
System.out.println( "in method exchangeString before exchange :" );
System.out.println( "output parameterStrA@" + parameterStrA );
System.out.println( "output parameterStrB@" + parameterStrB );
//使用临时变量的方法交换两个形参
String s = parameterStrA ;
parameterStrA = parameterStrB;
parameterStrB = s;
//交换后输出两个形参
System.out.println( "in method exchangeString after exchange :" );
System.out.println( "output parameterStrA@" + parameterStrA );
System.out.println( "output parameterStrB@" + parameterStrB );
}
public static void main( String[] args )
{
//初始化并输出两个实参
String argumentStrA = new String( "i'm a" );
String argumentStrB = new String( "i'm b" );
System.out.println( "out of method before exchange:" );
System.out.println( "output argumentStrA@" + argumentStrA );
System.out.println( "output argumentStrB@" + argumentStrB );
//调用交换方法
exchangeString( argumentStrA , argumentStrB );
//输出两个实参
System.out.println( "out of method after exchange:" );
System.out.println( "output argumentStrA@" + argumentStrA );
System.out.println( "output argumentStrB@" + argumentStrB );
//***********************************************************************
String s = new String("s");
s = "ss";
System.out.println( "s is "+s );
}
}
下面为程序输出结果:
out of method before exchange:
output argumentStrA@i'm a
output argumentStrB@i'm b
in method exchangeString before exchange :
output parameterStrA@i'm a
output parameterStrB@i'm b
in method exchangeString after exchange :
output parameterStrA@i'm b
output parameterStrB@i'm a
out of method after exchange:
output argumentStrA@i'm a
output argumentStrB@i'm b
为了进一步说明,再举一个例子
public class TestStringEvaluation{
public static void main(String arg[]){
String string1=new String ("string1 unchanged");
MyString string2=new MyString("string2 unchanged");
System.out.println(string1);
System.out.println(string2.string);
Change a=new Change();
a.ChangeString(string1);
a.ChangeMyString(string2);
System.out.println(string1);
System.out.println(string2.string);
}
}
class Change{
void ChangeString(String temp1){
System.out.println( "before evaluation temp1.hashCode() is " + temp1.hashCode() );
temp1="string1 changed"; //赋值后形参temp1的值发生改变,变为“=”带来的新String对象的引用值。
System.out.println( "after evaluation temp1.hashCode() is " + temp1.hashCode() );
}
//形参temp2虽为实参的一个副本,但temp2.string却并非形参,而是实实在在的
//MyString对象里的公有数据成员string,因此赋值后,temp2.string已经指向了一个新的对象
//"="返回的新String对像,所以在后续的输出时有变化。
//一定要注意 temp2 与 temp2.string的区别
//一个是形参,一个是实际对象里的String对象引用
void ChangeMyString(MyString temp2)
{ System.out.println( "before evaluation temp2.string.hashCode() is " + temp2.string.hashCode() );
temp2.string="string2 changed";
System.out.println( "after evaluation temp2.string.hashCode() is " + temp2.string.hashCode() );
}
}
class MyString
{
public String string;
MyString(String temp)
{
string=temp;
}
}
输出结果是:
string1 unchanged
string2 unchanged
before evaluation temp1.hashCode() is 1239571483
after evaluation temp1.hashCode() is -513711916
before evaluation temp2.string.hashCode() is -557379876
after evaluation temp2.string.hashCode() is 1973800917
string1 unchanged
string2 changed
分享到:
相关推荐
在本资源包“使用Java理解程序逻辑第14章.zip”中,重点是通过Java语言来深入理解程序逻辑。这通常意味着我们将探讨控制流程、循环、条件语句、函数以及可能涉及的数据结构等核心概念。JavaSE(Java Standard ...
这一章节主要聚焦于如何利用Java语言来构建和理解程序的逻辑结构,这对于掌握编程思维至关重要。在JavaSE的学习过程中,程序逻辑的理解是基础中的基础,它涉及到条件判断、循环控制、函数运用等多个核心概念。 首先...
4. **函数与方法**:函数是Java中复用代码的关键,学生需要学会定义和调用方法,理解参数传递和返回值。 5. **异常处理**:Java中的try-catch-finally结构用于处理程序运行时可能出现的错误。案例可能会设置特定...
6. **方法**:定义、调用方法,参数传递,以及重载和递归。 7. **异常处理**:理解异常的概念,如何抛出和捕获异常,以及finally块的使用。 8. **输入/输出流**:学习I/O流的基本原理,包括文件读写和网络通信。 9. ...
【随机组卷程序原创】这个项目是一个基于Java开发的应用,主要功能是实现随机组卷功能。在教育领域,这样的程序可以用于教师自动生成考试试卷,提高出卷效率,确保每份试卷的题目组合都是随机且独一无二的。接下来,...
5. **方法(函数)**:方法是实现代码复用和模块化的手段,学习如何定义和调用方法,理解参数传递机制,是提高代码效率的关键。 6. **字符串操作**:Java中的String类提供了丰富的字符串处理方法,理解和熟练运用...
Interpreter:给定一个语言, 定义它的文法的一种表示,并定义一个解释器, 该解释器使用该表示来解释语言中的句子。 Iterator:提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。 ...
Action类需要处理用户的请求,包括获取当前页码、计算每页显示的数据量等信息,并将这些参数传递给模型层进行数据库查询。 MySQL作为广泛使用的开源关系型数据库管理系统,提供了强大的SQL查询语言支持。在分页查询...
",然后通过 `<s:text>` 标签配合 `<s:param>` 标签传递参数,如 `<s:text name="helloMessage"><s:param value="username"/></s:param></s:text>`。 6. **使用 Java.text.MessageFormat**: - 当需要填充占位符时...
这涉及到了作用域管理、参数传递、返回值处理等一系列复杂的语言特性。对于初学者来说,实现这些功能无疑是一项挑战,需要对编译原理有深入的理解,包括词法分析、语法分析、抽象语法树(AST)的构建以及语义分析等...
在纯注解的SSH框架中,Struts2使用Action注解标记控制器类,@Result注解定义结果页面,@Param注解处理参数传递。这种注解方式使得控制器层的代码更加直观和简洁。 3. **Hibernate**:Hibernate是一个对象关系映射...
在Java编程中,设计模式的应用极大地提升了代码的可读性、可维护性和可扩展性。这个压缩包“设计模式实现代码”包含的是作者在学习设计模式过程中编写的实践代码,使用Eclipse开发环境,解压后可以直接运行,便于...
本教程由知名博主江南一点雨原创,旨在帮助初学者快速掌握 SpringMVC 的基本概念和实际应用。 1. **SpringMVC 概述** - SpringMVC 是 Spring 框架的一部分,它简化了在 Java Web 应用中处理请求和响应的过程。 - ...
3. 函数:解释如何在JavaScript中创建和使用函数,包括函数的定义、参数传递、返回值以及作用域等概念。 4. 对象和数组:阐述JavaScript中对象和数组的高级特性,包括对象字面量、数组方法、迭代器等。 5. 事件...
11. **Assembly**:汇编语言是一种低级编程语言,每个指令通常对应于机器语言中的一个机器码,用于编写操作系统和底层软件。 12. **Asynchronous**:异步通信是指两个或多个组件之间不以固定时序进行交互,它们独立...
- **定义**: 对原创作品的法律保护权。 - **权利**: 复制权、发行权等。 #### 29. Hot Link (热门链接) - **定义**: 网站上访问量较高或推荐给用户的链接。 - **作用**: 引导用户浏览更多内容。 #### 30. ...