`

参数传递及内存分析

阅读更多

参数传递总结
 
     要了解Java中的参数传递,首先需要了解在Java中的基本数据类型都
有哪些?在Java中,基本的参数类型有8种:
     byte字节型8bit、short短整型16bit、int整型32bit、long长整型64bit、
float浮点型单精度32bit、double浮点型双精度64bit、Boolean布尔型true
或false、char字符型16bit(字符可以存储一个汉字)。
    除了以上提及的8种基本数据类型,Java中还有引用类型,这些引用
类型包含用class、interface、abstractclass定义的类还有数组。这里举例
String类型,查看String的声明可以看到,String类型参数其实是用class
定义的一个类。
    那么在Java中参数是如何实现传递的呢?参数的传递也分为两种:
一、值传递:
    值传递适用于Java中的基本数据类型和String类型:
    如下代码:
   

 public class test(){
    public static void main(String[] args) { 
     int x = 1;//给x赋值
     int y = x;//把x的值赋给y
     y++;//对y做出改变
     System.out.println("x的值是:"+x+"    y的值是: "+y);

     String str1="张三";
     String str2="李四";
     str2=str1+"(但并非"+str1+"本人)";
     System.out.println("str1的名字:"+str1+"  str2的名字:"+str2);
 }
}

 

 

输出结果:x的值是:1  y的值是: 2
  str1的名字:张三  str2的名字:张三(但并非张三本人)

在引用类型的String进行值传递时str1、str2是两个同为String型的数据,
对两者中的任一个做改变都不会对另一个产生影响。
二、引用传递:
    引用传递适用于Java中的引用类型:
    如下代码:

public class Student(){
private String name;//名字属性
private int score;//学分属性

public String getName() {
 return name;
 }
 public void setName(String name) {
 this.name = name;
 }
 public int getScore() {
 return score;
 }
 public void setScore(int score) {
 this.score = score;
 }
 public void study(){
 score++;
 System.out.println(name+"学习中,学分是:"+score);
 }
}
 public class test(){
    public static void main(String[] args) { 
  Student stu1 = new Student();//创建一个学生类型的对象
stu1.setName("张三");//设置名字
stu.setScore(0);//初始化学分

Student stu1 = new Student();//创建一个学生类型的对象
stu1.setName("李四");//设置名字
stu.setScore(3);//初始化学分

stu1 = stu2;//赋值
//分别调用两个对象的学习方法 
stu1.study();
 stu2.study();
 }
}

 

 

输出结果:李四学习中,学分是:4
    李四学习中,学分是:5
由以上输出结果可知stu1.study();stu2.study();这两行代码所调用的都是
stu2中的Study方法;因为stu1 = stu2;把stu2 的值赋予了stu1,所以在
执行stu1.study();时实际是执行stu2.study();。
  所以在引用传递中对象中所存储的只是地址,当执行stu1 = stu2;时
stu1原有的地址被stu2的地址所取代,使用任何一个对象名来修改对
象的属性值时,另一个对象名来访问时,访问到的是改变之后的数
据。在调用Study方法时也就会调用以stu2为对象的方法。
     为更好地了解参数传递,需要了解变量和对象在内存中的存储方
式:
     内存分为栈内存和堆内存。栈内存中存储地址,名字,数据。
(正如前例中的student对象存在于栈内存中),堆内存中存储对象的属
性和方法(普通方法、构造方法)(如前例中student对象的study方法)。


 

分享到:
评论

相关推荐

    c# 值参数 内存分析图

    c# 值参数 内存分析 图解,是理解C#值参数的本质所在

    Python 073.参数的传递_传递可变对象_内存分析.mp4

    Python 073.参数的传递_传递可变对象_内存分析.mp4

    Python 074.参数的传递_传递不可变对象_内存分析.mp4

    Python 074.参数的传递_传递不可变对象_内存分析.mp4

    Python 076.参数的传递_不可变对象含可变子对象_内存分析.mp4

    Python 076.参数的传递_不可变对象含可变子对象_内存分析.mp4

    动力节点_Java基础视频教程25_ 对象参数传递内存分析

    动力节点的Java课程适合绝对零基础的观看,教程中讲解了Java开发环境搭建、Java的基础语法、Java的面向对象。每一个知识点都讲解的非常细腻,由浅入深。适合非计算机专业,想转行做Java开发的朋友,或者想让Java基础...

    全面解析C#中参数传递

    所以本文章将带领大家深入剖析下C#中参数传递的问题,并分享我自己的一个理解,只有你深入理解了才能在不运行程序的情况可以分析出参数传递的结果的。  二、按值传递  对于C#中的参数传递,根据参数的类型可以...

    Android开发中Intent传递对象的方法分析

    利用方法:public Intent putExtra (String name, Parcelable value)传递一个Parceable的参数,此方法的参数被序列化到内存。 利用方法:public Intent putExtra (String name, Serializable value)传递一个实现了...

    引用参数和传值参数的区别深入解析

    2. 引用做参数传递的是变量的地址; 实质上传递的是变量的指针; 引用作为参数的好处是减少了临时变量对内存的开销,因此常用于对大对象的操作; 而常引用做参数就是保护参数不被修改; 附:堆和栈的知识一个由c/C++...

    C#引用类型作为方法的参数分析

    在c#或java中,参数传递都是传递的参数本身的值, 对于值类型,传递的是值本身。 对于引用类型,定义引用类型变量的时候,一个是在栈中的变量,存储的是一个指针,指向在堆中分配的对象实例的地址,当然,如果对象...

    函数、内存、一维数组、二维数组

    形式参数:是一个变量,用于存储调用函数时传递给函数的实际参数。 实际参数:传递给形式参数的具体数值。 return:用于结束函数。 返回值:该函数运算后的结果,该结果会返回给调用者。 函数的特点 ...

    关于 byval 与 byref 的区别分析总结

    二者区别: byval 传递数值,实参和形参分处不同的内存单元,互不干扰! byref 传递地址,实参和形参占用相同的内存单元,形参变则实参变!!!!!! 通俗理解: byval 一去不复返 byref 进去再出来,可能被...

    C++调用Go方法的字符串传递问题及解决方案

    摘要:C++调用Go方法时,字符串参数的内存管理需要由Go侧进行深度值拷贝。 现象 在一个APP技术项目中,子进程按请求加载Go的ServiceModule,将需要拉起的ServiceModule信息传递给Go的Loader,存在C++调用Go方法,...

    java的传值与传引用详解

     当 Java 成长起来的时候,许多的 C 程序员开始转向学习 Java,他们发现,使用类似 SwapValue 的方法仍然不能改变通过参数传递进来的简单数据类型的值,但是如果是一个对象,则可能将其成员随意更改。于是他们觉得...

    uboot代码详细分析.pdf

    2 、Kernel 读取U-boot 传递的相关参数 56 3 、关于U-boot 中的bd 和gd 59 U-BOOT源码分析及移植 60 一、u-boot工程的总体结构: 61 1、源代码组织 61 2.makefile简要分析 61 3、u-boot的通用目录是怎么做到与平台...

    python 函数传参之传值还是传引用的分析

    首先还是应该科普下函数参数传递机制,传值和传引用是什么意思?  函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题。基本的参数传递机制有两种:值传递和引用...

    C语言难点分析整理

    2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38 8. C程序内存中组成部分 ...

    copyfighter:静态分析Go代码并报告按值传递大型结构的函数

    如果在不使用指向大型结构的指针的情况下传递大型结构,则在内存中复制新数据将导致更多分配和更多垃圾回收工作。 Copyfighter的静态分析将确定没有指针的大型结构在哪里用作方法接收器,函数参数和返回值。 使用go...

    MemSnap:一个 0.2KB 的分析微型库,记录内存使用快照随时间的变化

    日志记录是使用动态图像完成的,数据作为 url 参数传递,因此无需担心跨域安全限制。 url 格式基于您提供的模板,因此可以将数据发送到任何地方。例子将数据发送到 Google Analytics // An example of using ga-...

    C++中指针和引用的区别分析

    在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的: 指针传递参数本质上是值传递的方式,它所传递的是一个地址值。值传递过程中,被调函数的形式参数作为被调函数的...

    c语言难点分析整理,C语言

    7. C中可变参数函数实现 38 8. C程序内存中组成部分 41 9. C编程拾粹 42 10. C语言中实现数组的动态增长 44 11. C语言中的位运算 46 12. 浮点数的存储格式: 50 13. 位域 58 14. C语言函数二维数组传递方法 64 15. ...

Global site tag (gtag.js) - Google Analytics