Java的值传递说明

只有在方法调用的时候才涉及到值传递的概念!

Java中进行方法调用的时候传递参数时,遵循值传递的原则:
1)基本数据类型,传递的是数据的拷贝
2)引用数据类型,传递的是传递的引用地址的拷贝,而不是该对象本身

楼主的问题涉及到的内容太多,首先理解以下概念

形参:方法声明时的参数变量,用于接收调用方法时传过来的实参
如:void f(int i){}  或  void f(String s){}
实参:方法调用时实际传过去的内容,用于给形参赋值
如:f(1)  或  f("abc")

变量按不同的数据类型分为2类:
1)基本数据类型变量:4类8种基本类型,byte,short,char,int,long,float,double,boolean
如:int i = 0;
2)引用数据类型变量: 类,接口,数组
如:String s = "abc";

注意:Java中除了4类8种基本数据类型以外全部是引用数据类型

变量按声明的位置不同分为2类:
1)成员变量:方法外部,类内部声明的变量
2)局部变量:方法内部声明的变量,形参属于局部变量

变量的初始化:
1)成员变量:如果不显示对其初始化,那么Java采用默认值对其进行初始化
2)局部变量:不赋值,就不能使用

看来楼主对引用和对象的概念还不是特别了解,执行中的内存管理:

不同的操作系统不太一样,但一般内存都分为4个区域:
1)heap(堆):存放new出来的对象
2)stack(栈):存放局部变量
3)data segment(数据区):静态变量 和 字符串常量
4)code segment(代码区):存放代码

例子:
public class Test {

void f(int j) {
System.out.println(j);
}

void ff(String ss) {
System.out.println(ss);
}

public static void main(Stirng[] args) {
int i = 100;
String s = "hello";
Test t = new Test();
t.f(i);
t.ff(s);
}
}

当mian方法开始执行的时候
int i = 100; 栈中分配一块空间,存放变量i,值为100,基本数据类型只占一块空间
String s = "hello"; "hello"是字符串常量,分配在data区,字符串常量为String类的一个对象,
s指向了这个"hello"对象,这就是引用数据类型,在内存中占两块空间,
有点形象思维:一提引用类型,就是一块内存指向另一块内存
s可以被叫做:引用、引用变量、引用地址,其实s就是一个指针,在这里不用钻牛角尖,你就知道
s是一个引用,s的值是一个地址,根据这个地址就可以找到一个对象就ok了,
Test t = new Test(); 同理,栈中的引用t指向了堆中new出来的这个Test对象

Java中进行方法调用的时候传递参数时,遵循值传递的原则:
1)基本数据类型,传递的是数据的拷贝
2)引用数据类型,传递的是传递的引用地址的拷贝,而不是该对象本身

t.f(i);
方法的形参属于局部变量,所以在调用f方法的时候,栈内存分配一个int型的变量j,将i的值当做
实参传递过去,i的值是100,现在将100拷贝给了j,那么j的值就是100,这就是楼主说的“值传递
”,接着打印,最后方法结束,为该方法分配的局部变量立刻全部清空,那么Stack中这个j消失了

t.ff(s);
调用ff方法的时候,栈内存分配一个String型的变量ss,将s的值当做实参传递过去,s指向
了"hello"对象,s的值是一个地址,现在将这个地址拷贝给了ss,那么ss也就指向这个"hello"了
这就是楼主说的"引用传递",现在s 和 ss 两个引用 同时指向了"hello"对象,然后打印ss,最后方
法结束,栈中这个ss被清除

现在main方法执行结束,为main方法分类的局部变量清除,i,s,t全部消失,data区的符串常
量"hello"和堆内存的Test对象,由于没有任何引用指向他们了,就会被垃圾收集器回收

累死我了..

时间: 2024-10-10 19:51:24

Java的值传递说明的相关文章

Java 为值传递而不是引用传递

——reference Java is Pass by Value and Not Pass by Reference 其实这个问题是一个非常初级的问题,相关的概念初学者早已掌握,但是时间长了还是容易混淆,特此总结一下 一.值传递和引用传递 首先这里我们先看下两者的异同: 值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值. 引用传递:也称为传地址.方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中

java中值传递和引用传递

本来今天刚学习的内容,然后去其他博客看了下,发现都吵起来了,就是名字原因,有的说java有值传递和引用传递,有的说引用传递本质就是值传递,我管你杂说的,只要自己理解好,代码知道运行结果就好了. 我用自己的话,自己的理解来解释下,反正都是自己写着玩,自己看的 值传递:传递的值,这个值以后怎么改变,源值不会发生改变的. 引用传递:将对象的引用地址传递过去,如果值发生改变,那么源值也发生改变. 代码如下: 值传递: public class Test1 { public static void mai

为什么 Java 只有值传递,但 C# 既有值传递,又有引用传递,这种语言设计有哪些好处?

为什么 Java 只有值传递,但 C# 既有值传递,又有引用传递,这种语言设计有哪些好处? http://www.zhihu.com/question/20628016 Java值传递的终极解释 http://developer.51cto.com/art/201103/251163.htm

java是值传递还是引用传递

首先写一个简便的Employee,以便测试使用. class Employee { private String name; public Employee(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } } 然后写一个函数,传入一个Emplyee对象,修改name,如果函数执行完毕原

java 中值传递和引用传递(转)

java中给函数传递参数的方式有两种:值传递和引用传递.一般而言,基本类型是值传递:引用类型是引用传递.但传值时到达发生了什么? 1.基本类型 8个基本类型(byte,short,int,long,float,double,char,boolean)是值传递. 1 public class ValueTest { 2 3 public static void main(String[] args) { 4 int a = 10; 5 changeVal(a); 6 System.out.prin

java的值传递笔记

1. 背景:开发小伙伴突然问我java是值传递还是引用传递,我说当然是值传递,只不过有时候传递一个对象时实际传递的是对象的地址值,所以让人容易产生一种引用传递的假象,貌似在李刚的疯狂java讲义有提到值传递. 2.于是,今晚就写起代码来验证一下,我去,居然纠结了一段时间. 因为直接写一个方法,带上基本类型和包装类型来一同做校验,思路是: 方法内,对形参进行加减操作,以便查看是否实参也会改变值(如果是值传递,基本类型是不会影响到实参的值的,引用类型的话,改变值一般会改变实参的值,我指的是成员值,当

Java是值传递还是引用传递?

Java是值传递: (1)基本类型作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的: (2)对象的引用作为参数传递时,是把对象在内存中的地址拷贝了一份传给了参数,无论怎么改变这个地址值,原值都不会改变. 参考:http://blog.sina.com.cn/s/blog_4b622a8e0100c1bo.html

这一次,彻底解决Java的值传递和引用传递

本文旨在用最通俗的语言讲述最枯燥的基本知识 学过Java基础的人都知道:值传递和引用传递是初次接触Java时的一个难点,有时候记得了语法却记不得怎么实际运用,有时候会的了运用却解释不出原理,而且坊间讨论的话题又是充满争议:有的论坛帖子说Java只有值传递,有的博客说两者皆有:这让人有点摸不着头脑,下面我们就这个话题做一些探讨,对书籍.对论坛博客的说法,做一次考证,以得出信得过的答案. 其实,对于值传递和引用传递的语法和运用,百度一下,就能出来可观的解释和例子数目,或许你看一下例子好像就懂,但是当

堆栈详解 + 彻底理解Java的值传递和引用传递

本文旨在用最通俗的语言讲述最枯燥的基本知识 学过Java基础的人都知道:值传递和引用传递是初次接触Java时的一个难点,有时候记得了语法却记不得怎么实际运用,有时候会的了运用却解释不出原理,而且坊间讨论的话题又是充满争议:有的论坛帖子说Java只有值传递,有的博客说两者皆有:这让人有点摸不着头脑,下面我们就这个话题做一些探讨,对书籍.对论坛博客的说法,做一次考证,以得出信得过的答案. 其实,对于值传递和引用传递的语法和运用,百度一下,就能出来可观的解释和例子数目,或许你看一下例子好像就懂,但是当

如何理解Java的值传递

结论 为了加深印象,先把结论放在文章开头. ++Java中只有值传递++. 形参与实参 在理解Java的值传递 实参Argument 实际参数,主调用函数传递给调用函数的参数 形参Parameter 形式参数,并非实际存在的变量,只在函数定义的函数内部使用.在调用函数时,实参将会给形参赋值,从而实现主调函数向调用函数传输数据的目的. 所谓的传递,就是实参给形参赋值的过程.这是我们理解值传递和引用传递的基础. 基本类型与引用类型 基本类型的变量保存值,即值就是变量自身. 而引用类型的变量的值表示对