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语言中参数传递机制进行了深入的剖析,首先从Java的变量内存分配机制开始,对不同的参数传递机制进行了分析,并得出了最合理的结论。 Java语言中参数传递机制可以分为两种情况,即按值传递和引用传递。按...
### Java中堆内存与栈内存分配浅析 #### 一、引言 在Java编程语言中,内存管理是一项至关重要的技术。程序运行时所使用的内存主要分为两类:堆内存(Heap Memory)和栈内存(Stack Memory)。理解这两种内存类型的...
#### 三、Java中的方法参数传递 Java中,无论是值类型还是引用类型,在作为方法参数传递时,都遵循着一种被称为“按值传递”的机制。这意味着,当我们将一个变量作为参数传递给方法时,实际上传递的是该变量的一个...
本主题涉及两个核心知识点:Java中的参数传递机制以及如何实现杨辉三角的算法。 首先,我们来讨论Java中的参数传递。在Java中,函数参数的传递方式只有两种,即按值传递(Pass by Value)和按引用传递(Pass by ...
2. **参数传递**:当调用重载方法时,参数值会被压入操作数栈,然后按照参数列表的顺序分配到局部变量表中。如果参数是对象,那么传递的是对象的引用,而不是整个对象,对象实例则存储在堆内存中。 3. **操作数栈**...
在Java编程语言中,参数传递是一项基础且至关重要的概念,它涉及到函数调用时值的传递方式。本文将深入探讨Java中的参数传递机制,帮助读者理解"引用"和"地址"的概念,以及它们如何影响程序执行。 Java有两种基本的...
在编程语言中,值传递和引用传递是函数参数传递的两种基本方式,它们涉及到内存管理、数据安全以及程序效率等多个重要方面。这篇文章将深入探讨这两种传递方式,并通过内存解析来帮助理解它们的工作原理。 首先,...
JAVA参数传递是JAVA编程语言中的一种函数调用机制,决定了函数参数的传递方式。下面对JAVA内存分配和参数传递进行详细的介绍。 JAVA内存分配 JAVA内存分配是指JAVA程序在内存中的存储方式。JAVA内存分配可以分为五...
Java参数传递机制是一个经常引起讨论的话题,尤其是在初学者和经验丰富的开发者之间。Java中参数传递的基本原则可以总结为:对于所有类型的参数,Java总是进行值传递。然而,对于基本类型和对象引用,"值传递"的概念...
本文件主要探讨了Java中带有不同构造方法的程序如何影响内存分析,这包括无参构造方法、带参数的构造方法以及它们在内存分配中的应用。 首先,让我们了解一下构造方法。构造方法是一种特殊的方法,它的名字与类名...
Java总是以值传递方式进行,这意味着当你将一个变量作为参数传递给方法时,传递的是该变量所存储值的一个副本。然而,对于对象类型的变量,这个值实际上是一个引用,即指向对象内存位置的指针。理解这一点对于深入...
Java程序在执行过程中,其内存分配主要涉及到JVM(Java Virtual Machine,Java虚拟机)的不同区域。这些区域包括寄存器、栈、堆、常量池、代码段和数据段。理解这些内存区域的工作原理对于深入学习Java编程至关重要...
本篇文章将深入探讨JNI中参数传递的基本数据类型、自定义对象以及系统对象。 一、基本数据类型的参数传递 在JNI中,基本数据类型如int、float、char等的传递相对简单。Java中的基本类型在C/C++中都有对应的类型。...
Java 面向对象编程中,参数传递是非常重要的一个概念。参数传递有两种方式:值传递和引用传递。了解这两种方式的区别是非常重要的,因为它们对程序的执行结果产生了很大的影响。 值传递是指将实际的内存中的值传递...
本文将深入探讨`this`关键字在Java程序中的应用,以及它如何与内存分配相关联。 首先,`this`关键字在Java中主要表示当前对象的引用。它可以在类的方法中使用,用来访问该类的实例变量,调用其他方法,或者在构造器...
通过以上分析,我们可以看到《JAVA 内存视图与封装》这一课件涵盖了Java程序中对象在内存中的布局、封装的原则以及程序入口点的关键知识点。深入理解这些概念对于编写高质量的Java程序至关重要。此外,掌握对象在...
这意味着,当我们将一个对象作为参数传递给方法或赋值给另一个变量时,实际上是引用(内存地址)的复制,而不是对象的复制。 1. **传值与传引用的区别** - **传值**:基本数据类型(如int、char等)的参数传递是值...
3. **理解按值传递的概念**:Java中的所有参数传递都是按值传递的,即使是引用类型也不例外。这意味着在方法内部对参数的修改不会影响到外部的原始变量。 掌握这些核心概念对于理解Java中引用类型的行为至关重要,...