Java学习(五)---java值传递

来源:互联网 发布:淘宝秒杀最准的时间 编辑:程序博客网 时间:2024/05/15 16:32

1、按值调用(call by value)表示方法接收的是调用者提供的值。
      按引用调用(call by reference)表示方法接收的是调用者提供的变量地址。
2、一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。
3、java程序设计语言总是采用按值调用。也就是说,方法得到的是所有参数值得一个拷贝,特别是,方法不能修改传递给他的任何参数变量的内容。
4、实现一个改变对象参数状态的方法并不是一件难事。理由很简单,方法得到的是对象引用的拷贝,对象引用及其他的拷贝同时引用同一个对象。
                                                                                                     —摘自《Java核心技术》

如何理解上面的几句话,我们需要搞清楚下面几个问题?
一、搞清楚基本数据类型和引用数据类型的不同之处?

int age = 21;String name = "Peter";

这里写图片描述

如上图所示:
age是基本数据类型,所以值就直接保存到变量中。
而name是引用数据类型,所以变量中保存的只是实际对象的地址。一般称这种变量为”引用”,引用指向实际对象,实际对象中保存着内容。

引用类型(reference type)指向一个对象,不是原始值,指向对象的变量是引用变量

二、搞清楚赋值操作=的作用?

int age = 20;String name = "Jack";

这里写图片描述

赋值操作= (包括+=、-=、/=等都包含赋值操作) 不同于Java中的+-*/,= 是一个可以改变内存状态的操作,一个可以改变变量的符号。
这里的赋值操作其实包含了两个意思:
1、放弃原有的值或引用
2、得到 = 右侧变量的值或引用

仔细说来:
(1)对于基本数据类型的变量, = 操作是完整地复制了变量的值。也就是说对于基本数据类型的变量,= 之后左右两侧的变量不再关联。
(2)对于引用数据类型变量,= 操作是复制了变量的引用。此时左右两侧的变量都指向同一个对象。

三、调用方法时的参数传递本质上就是一种赋值操作

So,简单说来
        如果参数是基本类型,传递的是基本类型的字面量值的拷贝。
        如果参数是引用类型,传递的是该参量所引用的对象在堆中地址值的拷贝
也就是说,不论是引用类型还是基本类型,参数传递的都是一个值(一个字面值,一个地址值)

这个时候在回过来看一下上面的几句话,是不是清晰了很多呢。


java到底是值传递还是引用传递?
以上内容均由此整理

注:本人正在学习状态,文中多有引用,也有解释纰漏之处,敬请包涵、指正!

0 0