面向对象之值传递
来源:互联网 发布:苹果软件开发培训 编辑:程序博客网 时间:2024/06/04 19:55
在Java中方法的参数传递方式只有一种,那就是值传递.所谓的值传递,就是在向方法的形参传递实际参数的时候,是传递实际参数的副本,而对参数本身没有任何影响,在这里,主要分为两种值类型的传递.
第一种是基本数据类型的传递
这是比较容易理解的一种值传递,比较经典的例子就是swap方法用来交换两个值.
public class testInt{
public staticvoid swap(int a,int b){
int temp= 0;
temp = a;
a = b;
b = temp;
System.out.println("在swap函数内部的a = " + a +" b="+b);
}
public staticvoid main(String[] args){
int a= 1;
int b= 2;
System.out.println("运行swap函数之前的a = " + a +" b="+b);
swap(a,b);
System.out.println("运行了swap函数之后的a = " + a +" b="+b);
}
}输出的结果是
运行swap函数之前的a = 1 b= 2
在swap函数内部的a = 2 b= 1
运行了swap函数之后的a = 1 b= 2
由此可见,swap函数并未对main函数中的a和b互换值成功,但是a和b的数值又确实是传进了swap函数中;
看一下内存的过程
首先,main函数进栈,然后在栈中生成了a和b两个变量,,紧接着是将swap函数进栈,它也有个栈区,并且形参的值传入栈中,
现在开始进行swap的函数执行,执行了swap方法之后,swap中的值变化,由此可见,swap中的值交换成功,但是main函数的值并没有改变,所以这个函数并不能完成交换值
那么如何完成这个交换呢?
public class testInt{
static int a = 1;
static int b= 2;
public staticvoid swap(){
int temp= 0;
temp = a;
a = b;
b = temp;
System.out.println("在swap函数内部的a = " + a +" b="+b);
}
public staticvoid main(String[] args){
System.out.println("运行swap函数之前的a = " + a +" b="+b);
swap();
System.out.println("运行了swap函数之后的a = " + a +" b="+b);
}
}
这样运行结果就变成了
运行swap函数之前的a = 1 b= 2
在swap函数内部的a = 2 b= 1
运行了swap函数之后的a = 2 b= 1
即交换成功.
第二种引用类型在方法中的值传递,这个是一个容易造成误解的值传递,但其实我们只要记住,Java中方法的参数传递方式只有一种值传递一种方式就好了.但是,引用类型究竟在内存中是怎样操作的呢?
例如:
//定义一个类来存放数据
class Data{
int a;
int b;
}
public class DataSwap {
public static void swap(Datad){
int temp = d.a;
d.a = d.b;
d.b = temp;
System.out.println("在swap函数内部的a = " + d.a +" b="+d.b);
}
public static void main(String[]args){
Data data = new Data();
data.a = 1;
data.b = 2;
System.out.println("运行swap函数之前的a = " + data.a +" b="+data.b);
swap(data);
System.out.println("运行了swap函数之后的a = " + data.a +" b="+data.b);
}
}
运行结果是
运行swap函数之前的a = 1 b= 2
在swap函数内部的a = 2 b= 1
运行了swap函数之后的a = 2 b= 1
从结果看来,是交换成功了,这又是为什么呢?
看一下内存中发生了什么?
接下来,将d对象传给swap方法,如下图所示,也是将d的副本传给了swap函数;
如图所示,将d的副本传给swap,但是d的副本的值和d没有区别都是指向内存中相同的地址,所以swap的操作也是对原内存的操作,所以可以交换成功,如果我们将swap中的d赋值为null,这样的情况下,main栈区的d对象仍然可以访问到a,b的值,由此可见,swap的d和main中的d完全是两种不同的概率,并不影响.
- 面向对象之值传递
- 面向对象之值传递和引用传递
- java面向对象之值传递小实例
- 12-8java面向对象对象之引用传递
- 面向对象 引用传递
- 面向对象 引用传递
- 面向对象,引用传递
- Java面向对象-方法的值传递和引用传递
- 黑马程序员---Java基础学习之面向对象的值传递和引用传递
- java之值传递和对象传递
- java面向对象:引用传递
- 面向对象-方法参数传递
- 面向对象之对象
- 面向对象之对象
- 25-JAVA面向对象-JAVA关于值的传递详解
- 达内课程-面向对象之对象创建过程和java数据传递
- Java之函数值传递和对象传递
- Java面向对象【经典案例】Java 只有一种参数参数传递规则: 基于值的传递!
- LintCode-[中等] 221. 链表求和 II
- Linux文件系统编程 系统调用 文件复制
- 顺序栈实现机制
- pscp详解
- centos 编译 PHP5.6
- 面向对象之值传递
- 【笔记】各种锅的记录之未完待续
- 样本不均衡的解决方法
- 找合法帧
- Redis
- Linux文件系统编程 系统调用 打开读取写入文件
- 1.读取excel文件,将输入存储到数据库中(JXL) 2.完成商品的检索相关功能 1.根据分类,显示分类下所有的商品信息,按照库存量从低到高排序(提供补货依据) 2.模糊搜索,根据商品信息(名
- javascript学习回顾
- 剑指offer——最小的K个数