`
danlei94
  • 浏览: 9547 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

Java中参数传递与内存存储

阅读更多

Java中参数传递与内存存储

无论是Java还是C++,我们都会在写函数的时候遇到传值和传址的问题。在这里我就总结一下Java的参数传递,以及内存到底是如何存储的。

 

<!--[if !supportLists]-->一、<!--[endif]-->参数传递

<!--[if !supportLists]-->1.<!--[endif]-->值传递

大家先看一下下面的简单代码:

public static void main(String[] args) {

int i =0;

i++;

int j= i;

j++;

System.out.println("i = "+i);

System.out.println("j = "+j);

 

swap(i,j);

 

System.out.println("交换后----i = "+i);

System.out.println("交换后----j = "+j);

}

 

 

public static void swap(int a,int b)

{

int temp=a;

a=b;

b=temp;

}

}

 

你认为i,j交换了吗?

公布答案,i,j其实并没有交换。

输出的结果是:

i = 1

j = 2

交换后----i = 1

交换后----j = 2

 

概括来说,值传递其实是将参数的原始数值拷贝一份,然后参与函数内部的变换,但是并没有影响它原始的值。

<!--[if !supportLists]-->2.<!--[endif]-->址传递

除了数组名作为形参传递到函数中是址传递外(数组名存的是数组的首地址,地址传递肯定是址传递,这里就不多讲),还有一种情况,就是Java中经常遇到的对象赋值情况。

下面看一个例子

新建了一个Student类:

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);

}

}

 

在Test主函数中,有:

public static void main(String[] args) {

Student stu1 = new Student();

stu1.setName("张三");

stu1.setScore(5);

 

Student stu2 = new Student();

stu2.setName("李四");

stu2.setScore(1);

 

stu1.study();

stu2.study();

 

stu2 = stu1;//赋值操作

 

System.out.println("stu2 = stu1后----------");

 

stu1.study();

stu2.study();

   }

}

 

大家觉得结果会怎样呢?(别忘了study方法中还有score++哟!)

公布答案:

张三学习中,学分是:6

李四学习中,学分是:2

stu2 = stu1后----------

张三学习中,学分是:7

张三学习中,学分是:8

 

从结果中可以看出,赋值语句,其实是将stu2指向了stu1的地址,然后stu2就存的是张三和6分的学分了。

 

概括的说,址传递中,对象1=对象2 的 赋值 ,是将对象2中存储的内存首地址拷贝一份给对象1,对象1于是指向了对象2的地址,存储了对象2 的属性和方法。

址传递也一般使用与非基本类型的引用类型

<!--[if !supportLists]-->二、<!--[endif]-->内存存储

内存主要包含:

<!--[if !supportLists]-->1.<!--[endif]-->堆:new的对象(包含属性方法等等)

<!--[if !supportLists]-->2.<!--[endif]-->栈:存储基本类型的数据名和值、对象名字和对象指向的堆的地址

<!--[if !supportLists]-->3.<!--[endif]-->静态内存:存储用static定义静态成员

 

 

总结:值传递只是对参数内容的复制,不改变原本的内容;址传递是一种改变原来内容的传递,址传递应用的比较多的一个是数组名作为参数传递,一个是两个对象的赋值操作。

内存主要讨论堆栈和静态内存,一定要知道,类new出来的对象名是在栈里,类的具体方法属性是存储到堆里。8中基本类型的变量名和数值直接存储在栈里,其他的与new方法

相似。

 

<!--EndFragment-->

分享到:
评论

相关推荐

    JAVA语言中参数传递的深入剖析.pdf

    本文对Java语言中参数传递机制进行了深入的剖析,首先从Java的变量内存分配机制开始,对不同的参数传递机制进行了分析,并得出了最合理的结论。 Java语言中参数传递机制可以分为两种情况,即按值传递和引用传递。按...

    Java中堆内存与栈内存分配浅析

    ### Java中堆内存与栈内存分配浅析 #### 一、引言 在Java编程语言中,内存管理是一项至关重要的技术。程序运行时所使用的内存主要分为两类:堆内存(Heap Memory)和栈内存(Stack Memory)。理解这两种内存类型的...

    浅析Java引用类型和方法参数传递

    #### 三、Java中的方法参数传递 Java中,无论是值类型还是引用类型,在作为方法参数传递时,都遵循着一种被称为“按值传递”的机制。这意味着,当我们将一个变量作为参数传递给方法时,实际上传递的是该变量的一个...

    java学习参数传递 杨辉三角,大学java作业题

    本主题涉及两个核心知识点:Java中的参数传递机制以及如何实现杨辉三角的算法。 首先,我们来讨论Java中的参数传递。在Java中,函数参数的传递方式只有两种,即按值传递(Pass by Value)和按引用传递(Pass by ...

    java中方法重载内存分析

    2. **参数传递**:当调用重载方法时,参数值会被压入操作数栈,然后按照参数列表的顺序分配到局部变量表中。如果参数是对象,那么传递的是对象的引用,而不是整个对象,对象实例则存储在堆内存中。 3. **操作数栈**...

    java参数传递

    在Java编程语言中,参数传递是一项基础且至关重要的概念,它涉及到函数调用时值的传递方式。本文将深入探讨Java中的参数传递机制,帮助读者理解"引用"和"地址"的概念,以及它们如何影响程序执行。 Java有两种基本的...

    值传递与引用传递-内存解析

    在编程语言中,值传递和引用传递是函数参数传递的两种基本方式,它们涉及到内存管理、数据安全以及程序效率等多个重要方面。这篇文章将深入探讨这两种传递方式,并通过内存解析来帮助理解它们的工作原理。 首先,...

    浅谈JAVA内存分配与参数传递

    JAVA参数传递是JAVA编程语言中的一种函数调用机制,决定了函数参数的传递方式。下面对JAVA内存分配和参数传递进行详细的介绍。 JAVA内存分配 JAVA内存分配是指JAVA程序在内存中的存储方式。JAVA内存分配可以分为五...

    java参数传递(经典).docx

    Java参数传递机制是一个经常引起讨论的话题,尤其是在初学者和经验丰富的开发者之间。Java中参数传递的基本原则可以总结为:对于所有类型的参数,Java总是进行值传递。然而,对于基本类型和对象引用,"值传递"的概念...

    java中带有不同构造方法的程序内存分析

    本文件主要探讨了Java中带有不同构造方法的程序如何影响内存分析,这包括无参构造方法、带参数的构造方法以及它们在内存分配中的应用。 首先,让我们了解一下构造方法。构造方法是一种特殊的方法,它的名字与类名...

    Java是值传递,传对象引用也是通过值

    Java总是以值传递方式进行,这意味着当你将一个变量作为参数传递给方法时,传递的是该变量所存储值的一个副本。然而,对于对象类型的变量,这个值实际上是一个引用,即指向对象内存位置的指针。理解这一点对于深入...

    Java内存分配全面解析

    Java程序在执行过程中,其内存分配主要涉及到JVM(Java Virtual Machine,Java虚拟机)的不同区域。这些区域包括寄存器、栈、堆、常量池、代码段和数据段。理解这些内存区域的工作原理对于深入学习Java编程至关重要...

    JNI 参数传递 Android 自定义对象

    本篇文章将深入探讨JNI中参数传递的基本数据类型、自定义对象以及系统对象。 一、基本数据类型的参数传递 在JNI中,基本数据类型如int、float、char等的传递相对简单。Java中的基本类型在C/C++中都有对应的类型。...

    Java面向对象值传递和引用传递

    Java 面向对象编程中,参数传递是非常重要的一个概念。参数传递有两种方式:值传递和引用传递。了解这两种方式的区别是非常重要的,因为它们对程序的执行结果产生了很大的影响。 值传递是指将实际的内存中的值传递...

    java中带有this关键字的程序内存分析

    本文将深入探讨`this`关键字在Java程序中的应用,以及它如何与内存分配相关联。 首先,`this`关键字在Java中主要表示当前对象的引用。它可以在类的方法中使用,用来访问该类的实例变量,调用其他方法,或者在构造器...

    JAVA 内存视图与封装

    通过以上分析,我们可以看到《JAVA 内存视图与封装》这一课件涵盖了Java程序中对象在内存中的布局、封装的原则以及程序入口点的关键知识点。深入理解这些概念对于编写高质量的Java程序至关重要。此外,掌握对象在...

    Java-Java面向对象中引用传递教程

    这意味着,当我们将一个对象作为参数传递给方法或赋值给另一个变量时,实际上是引用(内存地址)的复制,而不是对象的复制。 1. **传值与传引用的区别** - **传值**:基本数据类型(如int、char等)的参数传递是值...

    Java引用变量传递诡异之处

    3. **理解按值传递的概念**:Java中的所有参数传递都是按值传递的,即使是引用类型也不例外。这意味着在方法内部对参数的修改不会影响到外部的原始变量。 掌握这些核心概念对于理解Java中引用类型的行为至关重要,...

Global site tag (gtag.js) - Google Analytics