`
danlei94
  • 浏览: 9250 次
  • 性别: 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程序设计基础:方法的值传递.pptx

    调用一个方法时,系统都会将参数、局部变量存储在一个称为堆栈的内存区域中,这个区域称为调用栈,或执行栈。它以先进后出的方式存储数据。一个方法调用结束,其相应的堆栈空间释放。 方法的值传递 m

    java jdk实列宝典 光盘源代码

    java的参数传递;自定义形状类;类的加载顺序;方法和变量在继承时的覆盖和隐藏;排序类; 3数字 数字类;格式化数字;转换数字进制;生成随机数; 4数组和集合 使用Arrays类;动态调整数组长度;java为数据结构中的...

    JAVA面试题最全集

    方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() ...

    java 面试题 总结

    如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了。如果在一个类中定义了多个同名的...

    java面试宝典

    21、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 10 22、我们在web 应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,...

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

    Java程序在运行时,需要在内存中的分配空间。为了提高运算效率,有对空间进行了不同区域的划分,因 为每一片区域都有特定的处理数据方式和内存管理方式。 栈内存  用于存储局部变量,当数据使用完,所占空间会...

    疯狂JAVA讲义

    5.2.2 方法的参数传递机制 116 5.2.3 形参长度可变的方法 120 5.2.4 递归方法 121 5.2.5 方法重载 123 学生提问:为什么方法的返回值类型不能用于区分重载的方法? 124 5.3 成员变量和局部变量 124 5.3.1 成员...

    Java核心技术II(第8版)

    4.10 Web与企业应用中的连接管理 4.11 LDAP介绍 4.11.1 配置LDAP服务器 4.11.2 访问LDAP目录信息 第五章 国际化 5.1 Locales 5.2 数字格式 5.2.1 货币 5.3 日期和时间 5.4 排序 5.4.1 排序强度 5.4.2 分解 10.5 ...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    在 java 语言中,Java 程序的基本单位是类,也就是说:一个 Java 程序是由多个类组成 的。定义一个类与定义一个数据类型是有区别的。在程序设计语言中,把定义数据类型的能 力作为一种很重要的能力来对待。在面向...

    操作系统(内存管理)

    不过,虚拟内存系统不需要将其存储在位置为 629 的 RAM 中。实际上,它甚至可以不在 RAM 中 —— 如果物理 RAM 已经满了,它甚至可能已经被转移到硬盘上!由于这类地址不必反映内存所在的物理位置,所以它们被称为...

    Java2核心技术.part5

    5.4 远程方法中的参数传递 5.5 服务器对象激活 5.6 JavaIDL与CORBA 5.7 远程方法调用与SOAP 第6章 高级Swing 第7章 高级AWT 第8章 JavaBean构件 第9章 安全 第10章 国际化 第11章 本地方法 第12章 XML 第...

    java面试题

    35. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 18 36. swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?...

    超级有影响力霸气的Java面试题大全文档

    如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了。如果在一个类中定义了多个同名的...

    java基础题 很全面

    36. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 11 37. 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此...

    Java2核心技术.part3

    5.4 远程方法中的参数传递 5.5 服务器对象激活 5.6 JavaIDL与CORBA 5.7 远程方法调用与SOAP 第6章 高级Swing 第7章 高级AWT 第8章 JavaBean构件 第9章 安全 第10章 国际化 第11章 本地方法 第12章 XML 第...

    Java2核心技术.part1

    5.4 远程方法中的参数传递 5.5 服务器对象激活 5.6 JavaIDL与CORBA 5.7 远程方法调用与SOAP 第6章 高级Swing 第7章 高级AWT 第8章 JavaBean构件 第9章 安全 第10章 国际化 第11章 本地方法 第12章 XML 第13章 注释

    Java2核心技术.part6

    5.4 远程方法中的参数传递 5.5 服务器对象激活 5.6 JavaIDL与CORBA 5.7 远程方法调用与SOAP 第6章 高级Swing 第7章 高级AWT 第8章 JavaBean构件 第9章 安全 第10章 国际化 第11章 本地方法 第12章 XML 第...

    Java2核心技术.part4

    5.4 远程方法中的参数传递 5.5 服务器对象激活 5.6 JavaIDL与CORBA 5.7 远程方法调用与SOAP 第6章 高级Swing 第7章 高级AWT 第8章 JavaBean构件 第9章 安全 第10章 国际化 第11章 本地方法 第12章 XML 第...

    Java2核心技术.part2

    5.4 远程方法中的参数传递 5.5 服务器对象激活 5.6 JavaIDL与CORBA 5.7 远程方法调用与SOAP 第6章 高级Swing 第7章 高级AWT 第8章 JavaBean构件 第9章 安全 第10章 国际化 第11章 本地方法 第12章 XML 第...

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

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

Global site tag (gtag.js) - Google Analytics