`

关于java传参的分析

阅读更多
今天看到了一个这样的题:
    public static void main(String[] args){
            
        Point point1 = new Point(0,0);
        Point point2 = new Point(0,0);
        modify(point1,point2);
        System.out.println("["+point1.x+","+point1.y+"]"+"["+point2.x+","+point2.y+"]");
    }
   
    public static void modify(Point point1,Point point2){
       
        Point temp =point1;-------1
        point1=point2;--------2
        point2=temp;---------3
       
        point1.setLocation(5, 5);             
        point2 = new Point(5,5);
    }
最后打印的是什么:【0,0】【5,5】
这道题诠释了java关于传参的两种方式即值传递和引用传递。
值传递应该很好理解,即把变量的实际值传个方法的参数。同时我们要弄清方法的形参和实参是不同的变量,不能相互代替。
那引用传递简单点就是把对象在内存中的地址传给形参。所以上面那个题应该这样理解,
main方法里面的point1代表的Point对象的地址传给了modify形参的point1同理point2也是一样的。但当执行到modify中的2处时就变了,因为modify中的point1代表的地址值变成了main方法中的point2的地址了,所以modify中接下来的point1.setLocation(5, 5);改变的是main中的point2对象的中的值,modify方法中point2在3处指向了main方法中的point1的地址了,如果在这之后调用point2的方法更新,那更新的将是main方法中的point1对象的值。但最后point2指向了一个新对象。所以就和main中的point1,point2没有半毛关系了。

所以说java中值传递传的是基本类型和不可变对象例如String对象。而引用传参传的是对象的地址而已,且不要把形参和实参理解成是相同的变量哦,其实就是不同的变量而指向相同的地址而已。因为变量存储在栈内存中,对象是存储在堆内存中。
分享到:
评论

相关推荐

    Java开启新线程并传参方法代码实现

    "Java开启新线程并传参方法代码实现" Java开启新线程并传参方法代码实现是Java编程语言中一个重要的知识点,主要介绍了如何在Java中开启新线程并传参的方法代码实现。本文通过示例代码介绍的非常详细,对大家的学习...

    java远程方法调用

    #### 四、示例代码分析 下面通过一个简单的示例来理解RMI的实现过程: ##### 远程接口定义(`Rem.java`) ```java import java.rmi.*; public interface Rem extends Remote { public String getMessage() ...

    java操作数据库万能增,删,改

    通过上述分析,我们可以看出,使用Java的预编译SQL语句进行数据库的增、删、改操作不仅提高了代码的重用性和可维护性,还增强了应用程序的安全性和执行效率。这种“万能”的操作方式在实际开发中具有极高的实用价值...

    java 之方法调用 方法传参 值传递还是引用传递字节码

    本文将深入探讨Java中的方法调用、值传递与引用传递,并通过字节码分析来进一步理解这些概念。 首先,我们来看方法调用。在Java中,方法是一组完成特定任务的代码块,可以通过方法名来调用执行。方法调用的基本语法...

    get方式传参中文乱码问题的解决方案

    #### 原因分析 GET请求中的参数是通过URL直接传递的,当参数包含中文字符时,如果URL编码不正确或者服务器端没有正确地解码这些参数,就会出现乱码问题。主要原因包括: 1. **客户端与服务器端编码不一致**:...

    java 用HttpsURLConnection进行传递中文时错误总结

    通过阅读和分析这个代码,你可以更深入地理解如何在实际项目中处理这类问题。 总的来说,处理`HttpsURLConnection`中中文字符的关键在于正确设置字符集,确保数据在编码和解码过程中的一致性。同时,对SSL/TLS配置...

    调用codesoft案例

    通过以上分析,我们可以看到该案例提供了一个基本框架,演示了如何利用 Java 与 SWT 库来操作 Codesoft。这种方式适用于需要集成打印功能的应用程序,特别是在企业级应用中,这种技术可以极大地简化开发流程并提高...

    通过字节码看java中this的隐式传参详解

    Java中的隐式传参详解 通过字节码看Java中的this隐式传参是Java语言中一个非常重要的概念,本文将通过示例代码详细介绍如何通过字节码看Java中的this隐式传参的相关资料。下面我们将详细解释this关键字的隐式传参...

    jsp传参特殊字符

    对于JSP项目中通过URL传参涉及到特殊字符的情况,正确的做法是在前端使用JavaScript的`encodeURIComponent()`函数进行编码,在后端使用Java的`URLDecoder.decode()`进行解码。这样可以确保特殊字符被正确处理,避免...

    Java反序列化漏洞静态分析与动态验证研究与实现

    具体来说,这个过程涉及解析Java字节码文件,从中提取条件语句信息、传参信息和调用信息。这些信息是分析反序列化漏洞传播的关键。接下来,利用这些信息来创建控制流图,并在控制流图的基础上,使用污点分析技术标记...

    Java可变参数demo

    在这个名为"Java可变参数demo"的示例中,开发者通过分析Android蓝牙框架层的源码,对Java的可变参数有了更深入的理解,并编写了一个小的演示程序以备后用。下面我们将详细探讨Java可变参数的相关知识点。 1. 可变...

    java导出PDF文件的例子

    此外,通过传参的方式生成PDF,意味着可以根据用户输入或程序动态参数来生成定制化的PDF内容。例如,可以从URL接收参数,或者在命令行中传递参数,根据这些参数调整PDF的内容。 示例代码中的`extPDF.java`可能包含...

    深入理解JAVA虚拟机实用技巧案例讲解.ppt

    总之,理解JVM的工作机制,掌握如何正确传递参数,避免大对象使用,处理好内存管理和线程安全,以及熟练运用JVM分析工具,都是Java开发中不可或缺的技能。通过这些实践和案例学习,开发者能够更好地优化代码,提升...

    vue-router 路由传参用法实例分析

    本文实例讲述了vue-router 路由传参用法。分享给大家供大家参考,具体如下: 在设置路由规则时,我们可以给路径名设置一个别名,方便进行路由跳转,而不需要去记住过长的全路径。 例如: <%@ taglib prefix=...

    @Formula的作用和使用

    #### 五、实战案例分析 假设有一个新闻系统,其中新闻表`news`包含以下字段:`id`, `title`, `content`。为了方便展示,我们需要将新闻的标题和内容合并成一篇完整的文章,但又不想直接在数据库中存储合并后的全文,...

    java web开发技术大全

    5.2.2 分析由JSP生成的Servlet代码 5.3 JSP基本语法 5.3.1 JSP表达式 5.3.2 在JSP中嵌入Java代码 5.3.3.JSP声明 5.3.4.JSP表达式语言(EL) 5.3.5 实例:用EL函数替换HTML中的特殊字符 5.3.6 ...

    java web技术开发大全(最全最新)

    5.2.2 分析由JSP生成的Servlet代码 5.3 JSP基本语法 5.3.1 JSP表达式 5.3.2 在JSP中嵌入Java代码 5.3.3.JSP声明 5.3.4.JSP表达式语言(EL) 5.3.5 实例:用EL函数替换HTML中的特殊字符 5.3.6 JSP页面...

    JAVA的LIST接口的REMOVE重载方法调用原理解析

    最后,我们通过反编译源码来分析REMOVE方法的调用原理。结果表明,反编译代码中都是调用实例方法的命令,這也证明了JVM在编译时确定调用的传参类型,静态分派到具体方法的。 本文详细介绍了JAVA LIST接口的REMOVE...

Global site tag (gtag.js) - Google Analytics