`

Java参数分析

阅读更多
1.Java的数据类型
1)基本数据类型
int,char,float,byte,long,short,double,boolean
2)引用数据类型(对象类型,类类型)
数组,类,接口,抽象类都属于引用数据类型。

要讨论参数传递方式,就得从内存模型说起,主要是我个人觉得从内存模型来说参数传递更为直观一些。
内存模型涉及到两种类型的内存:栈内存(stack)和堆内存(heap)。

2.什么是值传递?
基本类型作为参数传递时,传递的是这个值的拷贝。无论你怎么改变这个拷贝,原值是不会改变的。方法括号中的就是形参,传入进去的是实参。

实例:
public class TestDemo {
public static void main(String[] args) {
int score = 5;
Student stu = new Student();
stu.setScore(score);
System.out.println("stuScore = "+stu.getScore());
System.out.println("TestDemo= "+score);
}
}

public class Student {
private int score;
public void setScore(int score){
score++;
this.score = score;
}
public int getScore(){
return score;
}
}

程序运行结果是:
stuScore=6
TestDemo=5
程序运行的结果也说明这一点,无论你在setScore()方法中怎么改变参数score的值,原值Score都不会改变。
下边通过内存模型来分析一下
 当执行了int score=5;这句代码后,程序在栈内存中开辟了一块地址为@123的内存,里边放的值是5,内存模型如下图:
栈内存
score(@123)
5

 执行到Student stu = new Student()时,程序在栈内存中又开辟了一块地址为@456的内存,创建stu对象,程序在堆内存中又开辟了一块地址为@789的内存,存放score属性以及setScore()方法,此时这块stu内存里边放的值是score属性与setScore()方法的地址,执行到setScore()方法时,将score的值5传递进来,此时这块内存里边放的值是5,执行score++;后,score中的值变成了6。内存模型如下图:  


    栈内存                              堆内存
   score(@123)
     5

     
    stu(@456)                          @789
    @789                              core=null-->6
                                  ssetScore(int score){}

3、只要形式参数类型是基本数据类型或者String时,都属于值传递   int,char,float,byte,long,short,double,boolean,String

一定要注意String的特殊性,在Java中,String是一个引用类型,但是在作为参数传递的时候表现出来的却是基本类型的特性,即在方法中改变了String类型的变量的值后,不会影响方法外的String变量的值。
实例:
public class TestDemo {
public static void main(String[] args) {
String score = "5";
Student stu = new Student();
stu.setScore(score);
Student stu1 = new Student();
stu1.setScore("6");
System.out.println("stu1 = "+stu1.getScore());
System.out.println("stu = "+stu.getScore());

}
}



public class Student {
private String score;
public Student(){}
public void setScore(String score){
this.score = score;
}
public String getScore(){
return score;
}
}
程序运行结果:
stu1 =6
stu =5
内存模型分析与上述是一样的。

4、什么是引用传递(地址传递)
创建对象时,对象名存储的是对象在内存中的首地址。
将对象名A存储的内容赋给另一个对象名B,实际上就是把A地址赋给一个新对象名B;
这样两个对象名A、B就存储了同一个对象在内存中的地址;
使用其中一个对象名B将对象的属性值修改后,那么另一个对象名A的也会改变。

实例:
public class TestDemo {
public static void main(String[] args) {
String score = "5";
Student stu = new Student();
stu.setScore(score);
Student stu1 = new Student();
Stu1=stu;
stu1.setScore("6");
System.out.println("stu1 = "+stu1.getScore());
System.out.println("stu = "+stu.getScore());
}
}

public class Student {
private String score;
public Student(){}
public void setScore(String score){
this.score = score;
}
public String getScore(){
return score;
}
}

程序运行结果:
stu1 = 6
stu =6
当对象作为参数传递时,传递的是对象的引用,也就是对象的地址。下边用内存模型图来说明:
当程序执行Student stu = new Student();后,程序在栈内存中开辟了一块地址编号为@456内存空间,用于存放stu的引用地址,里边放的值是堆内存中的一个地址,示例中的值为@789,可以理解为有一个指针指向了堆内存中的编号为@789的地址。堆内存中编号为@789的这个地址中存放的才是stu的值.

       栈内存          堆内存
      score(@123)
          5

       stu(@456)                                @789     
        @789                                 score=null
                                                Student(){}
                                            setScore(String score){}
                                                 getScore(){}

当程序进入Student stu1 = new Student();Stu1=stu;后,将stu的值,也就是对象的引用@789传了进来。这时,程序在栈内存中又开辟了一块编号为@112的内存空间,里边放的值是传递过来的值。可以理解为栈内存中的编号为@112的内存中有一个指针,也指向了堆内存中编号为@789的内存地址,在setScore()方法中将score的值修改为6,如图所示:

        栈内存                            堆内存
       score(@123)
           5

stu(@456)                         @789     
@789             score=null-->6                                 
                                            Student(){}
                                       setScore(String score){}
                                         getScore(){}
        Stu1(@112)                                  
            @789

无论是基本类型作为参数传递,还是对象作为参数传递,实际上传递的都是值,只是值的的形式不用而已。第一个示例中用基本类型作为参数传递时,将栈内存中的值5传递到了setScore()方法中。第二个示例中用对象作为参数传递时,将栈内存中的值@789传递到了setScore()方法中。当用对象作为参数传递时,真正的值是放在堆内存中的,传递的是栈内存中的值,而栈内存中存放的是堆内存的地址,所以传递的就是堆内存的地址。这就是它们的区别。

5、在程序中通过什么方法传递参数
set方法传递参数
构造方法传递参数
行为方法传递参数

补充:如果是重写方法,那么一定不能增加参数。
分享到:
评论

相关推荐

    HL7解析 Java

    在Java中,HL7解析通常涉及使用HAPI(HL7 Application Programming Interface)库。HAPI是Java平台上的一个开源框架,它提供了对HL7 v2.x消息的强大支持,包括解析、创建和验证HL7消息。HAPI不仅简化了HL7消息处理,...

    Java解析wsdl文档获取具体的方法与参数

    总结,Java解析WSDL文档获取具体的方法与参数涉及的主要知识点包括:XML解析(DOM)、JAX-WS框架、`javax.xml.ws.Service`类的使用,以及如何基于WSDL生成服务客户端代码。理解这些概念,将有助于开发和消费Web服务...

    java 请求参数过滤拦截

    3. **URL编码**:对URL参数进行编码,避免URL中的特殊字符引起解析问题。可以使用`URLEncoder.encode()`方法进行编码。 4. **白名单策略**:只允许特定字符或字符集,而非黑名单策略(即阻止某些字符)。这可以更...

    java解析wsdl文档获取方法与参数

    总结,Java解析WSDL文档获取方法与参数涉及到的技术点包括:了解WSDL的基本概念,使用Apache CXF或其他类似库,加载和解析WSDL文档,获取服务、端点、操作和消息信息,最后可能还需要生成Java客户端代码以便于调用...

    java 公式解析源码

    `doc`目录可能包含了API文档,这些文档通过Javadoc等工具生成,可以帮助开发者理解如何使用这个公式解析库,包括类的使用、方法签名、参数和返回值的说明。 `lib`目录可能包含了项目所依赖的外部库。对于公式解析,...

    java 参数传递

    Java 参数传递机制详解 Java 中的参数传递机制是一个经久不息的讨论...Java 参数传递机制详解,揭开了 Java 中的参数传递机制的奥秘,详细分析了基本类型和对象作为参数传递的机制,并揭开了对象作为参数传递的迷惑。

    java调用json参数的webservice

    在探讨Java调用带有JSON参数的WebService之前,我们首先需要了解几个关键的技术概念:Java、JSON以及WebService。 Java是一种广泛使用的编程语言,它具有面向对象、跨平台、多线程以及健壮性等特点。Java在企业级...

    dataTables java后台解析http请求参数demo

    在这个"datatables java后台解析http请求参数demo"中,我们将探讨如何利用Java技术在后台处理来自前端DataTable库的HTTP请求参数。DataTable是一款功能强大的jQuery插件,常用于实现动态、可排序、可搜索的数据表格...

    七参数坐标转换Java语言代码

    总的来说,这个Java项目提供了一个实用的工具,可以帮助GIS开发者和分析师在不同坐标系统之间进行准确的数据交换,这对于地图制图、导航系统、遥感和地理空间分析等领域都至关重要。通过深入理解这些代码,不仅可以...

    java 版Url转换工具,可得到真实的URL

    Java URL转换工具是一种用于解析和处理URL的程序,它能够帮助开发者获取URL背后的真实地址,尤其是在面对重定向、参数编码等情况时。在Web开发中,URL(Uniform Resource Locator)是互联网资源的统一地址,它包含了...

    java实现解析APK

    为了理解并分析APK文件,开发者有时需要解析它的内部结构。本篇将详细介绍如何使用Java和AAPT(Android Asset Packaging Tool)来解析APK,尤其适用于处理加密或加壳的APK。 首先,APK实际上是一个ZIP格式的压缩包...

    java虚拟机参数配置

    本文将围绕"java虚拟机参数配置"这一主题展开讨论,重点解析Heap Space与PermGen Space的配置细节。 ### Heap Space Heap Space是Java堆内存的一部分,用于存储对象实例。当Java程序启动时,JVM会为每个进程分配一...

    java参数的传递与返回值

    ### Java参数的传递与返回值 #### 一、Java参数传递的基本概念 在Java中,方法(或称为函数)可以通过参数来接收外部的数据,并且能够返回处理后的结果。参数的传递方式主要有两种:值传递(Pass-by-value)和引用...

    java可变参数

    Java可变参数是Java语言中一个非常实用的特性,它允许方法接受数量可变的参数。这个特性在Java 5中被引入,极大地提高了代码的灵活性和可读性。下面我们将详细探讨Java可变参数的概念、用法以及背后的实现原理。 ##...

    基于java实现的语法分析器及词法分析器

    在编程语言处理领域,语法分析器和词法分析器是至关重要的组成部分,它们主要用于解析源代码,将其转化为计算机可以理解的形式。在这个项目中,我们关注的是一个基于Java实现的语法分析器和词法分析器。Java是一种...

    java地址解析和反向地址解析

    `getByName()`方法是进行地址解析的关键,它接受一个字符串参数(通常是域名),返回一个`InetAddress`对象,该对象包含了对应IP地址的信息。 ```java try { InetAddress inetAddress = InetAddress.getByName(...

    Java中实现参数名ASCII码从小到大排序(字典序).doc

    在Java编程中,有时我们需要对一组参数...通过以上分析,我们可以看到`createSign`方法在处理参数排序时的高效和灵活性,它是Java编程中处理有序数据的一个典型应用。在实际项目中,可以根据需求对其进行调整和优化。

    Java读取解析GRIB2文件

    下面将详细介绍如何使用Java进行GRIB2文件的读取和解析。 1. **理解GRIB2文件结构**: GRIB2文件由多个消息组成,每个消息包含一组相关的气象数据。消息由一个固定长度的头部(Header)和可变长度的数据部分(Data...

    四参数曲线拟合java实现logistic

    最近做到曲线分析方面工作用的四参数拟合,google遍没有找到,没办法,最后只好自己实现了,跟主流拟合软件结果一致,强烈鄙视各种骗分行为!java源代码,你懂的

Global site tag (gtag.js) - Google Analytics