`
走了弯路的人
  • 浏览: 32739 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

(原创)JAVA语言的参数传递

阅读更多

 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理解程序逻辑第14章.zip”中,重点是通过Java语言来深入理解程序逻辑。这通常意味着我们将探讨控制流程、循环、条件语句、函数以及可能涉及的数据结构等核心概念。JavaSE(Java Standard ...

    使用Java理解程序逻辑第3章.zip

    这一章节主要聚焦于如何利用Java语言来构建和理解程序的逻辑结构,这对于掌握编程思维至关重要。在JavaSE的学习过程中,程序逻辑的理解是基础中的基础,它涉及到条件判断、循环控制、函数运用等多个核心概念。 首先...

    java课程设计--11个案例,适合大学生作业

    4. **函数与方法**:函数是Java中复用代码的关键,学生需要学会定义和调用方法,理解参数传递和返回值。 5. **异常处理**:Java中的try-catch-finally结构用于处理程序运行时可能出现的错误。案例可能会设置特定...

    零基础学Java教程PPT+视频+源代码

    6. **方法**:定义、调用方法,参数传递,以及重载和递归。 7. **异常处理**:理解异常的概念,如何抛出和捕获异常,以及finally块的使用。 8. **输入/输出流**:学习I/O流的基本原理,包括文件读写和网络通信。 9. ...

    随机组卷程序原创

    【随机组卷程序原创】这个项目是一个基于Java开发的应用,主要功能是实现随机组卷功能。在教育领域,这样的程序可以用于教师自动生成考试试卷,提高出卷效率,确保每份试卷的题目组合都是随机且独一无二的。接下来,...

    Chapter03Exercise.zip

    5. **方法(函数)**:方法是实现代码复用和模块化的手段,学习如何定义和调用方法,理解参数传递机制,是提高代码效率的关键。 6. **字符串操作**:Java中的String类提供了丰富的字符串处理方法,理解和熟练运用...

    java 设计模式资料

    Interpreter:给定一个语言, 定义它的文法的一种表示,并定义一个解释器, 该解释器使用该表示来解释语言中的句子。 Iterator:提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。 ...

    【原创】struts+mysql+jsp 分页

    Action类需要处理用户的请求,包括获取当前页码、计算每页显示的数据量等信息,并将这些参数传递给模型层进行数据库查询。 MySQL作为广泛使用的开源关系型数据库管理系统,提供了强大的SQL查询语言支持。在分页查询...

    美河原创视频Struts 2.0视频配套PPT

    ",然后通过 `<s:text>` 标签配合 `<s:param>` 标签传递参数,如 `<s:text name="helloMessage"><s:param value="username"/></s:param></s:text>`。 6. **使用 Java.text.MessageFormat**: - 当需要填充占位符时...

    武汉大学国际软件学院解释器构造作业二——JAVACC 的研究和应用

    这涉及到了作用域管理、参数传递、返回值处理等一系列复杂的语言特性。对于初学者来说,实现这些功能无疑是一项挑战,需要对编译原理有深入的理解,包括词法分析、语法分析、抽象语法树(AST)的构建以及语义分析等...

    ssh企业级框架精简版本,纯注解,绝对原创

    在纯注解的SSH框架中,Struts2使用Action注解标记控制器类,@Result注解定义结果页面,@Param注解处理参数传递。这种注解方式使得控制器层的代码更加直观和简洁。 3. **Hibernate**:Hibernate是一个对象关系映射...

    原创-设计模式实现代码

    在Java编程中,设计模式的应用极大地提升了代码的可读性、可维护性和可扩展性。这个压缩包“设计模式实现代码”包含的是作者在学习设计模式过程中编写的实践代码,使用Eclipse开发环境,解压后可以直接运行,便于...

    SpringMVC 入门教程.pdf

    本教程由知名博主江南一点雨原创,旨在帮助初学者快速掌握 SpringMVC 的基本概念和实际应用。 1. **SpringMVC 概述** - SpringMVC 是 Spring 框架的一部分,它简化了在 Java Web 应用中处理请求和响应的过程。 - ...

    js基础课程相关书籍(一)

    3. 函数:解释如何在JavaScript中创建和使用函数,包括函数的定义、参数传递、返回值以及作用域等概念。 4. 对象和数组:阐述JavaScript中对象和数组的高级特性,包括对象字面量、数组方法、迭代器等。 5. 事件...

    计算机专业名词解读计算机撒娇的

    11. **Assembly**:汇编语言是一种低级编程语言,每个指令通常对应于机器语言中的一个机器码,用于编写操作系统和底层软件。 12. **Asynchronous**:异步通信是指两个或多个组件之间不以固定时序进行交互,它们独立...

    PHP网站常用英文

    - **定义**: 对原创作品的法律保护权。 - **权利**: 复制权、发行权等。 #### 29. Hot Link (热门链接) - **定义**: 网站上访问量较高或推荐给用户的链接。 - **作用**: 引导用户浏览更多内容。 #### 30. ...

Global site tag (gtag.js) - Google Analytics