Java方法之参数传递机制
Java方法之参数传递机制
Java方法中如果声明了形参,在调用方法时就必须给这些形参指定参数值,实际传进去的这个值就叫做实参。
这就涉及到Java中的参数传递机制,值传递。
基本数据类型
基本数据类型,值传递的体现是数值的传递。
public class TransferTempTest {
public static void main(String[] args) {
//基本数据类型参数传递
TransferTempTest test = new TransferTempTest();
int num1 = 10;
int num2 = 20;
System.out.println("进行交换前:");
System.out.println("num1 = " + num1 + ",num2 = " + num2);
test.swap(num1, num2);
System.out.println("交换之后:");
System.out.println("num1 = " + num1 + ",num2 = " + num2);
}
public void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
System.out.println("交换过程中:");
System.out.println("num1 = " + a + ",num2 = " + b);
}
}
//运行结果
进行交换前:
num1 = 10,num2 = 20
交换过程中:
num1 = 20,num2 = 10
交换之后:
num1 = 10,num2 = 20
整个过程的内存图演示:
如图所示:
- 在堆内存中创建 TransferTempTest类型的对象,假设此时地址值时0x1177(只是假设),并让栈内存中的引用变量test存储0x1177,指向该对象。
- 在栈内存中声明两个变量num1和num2,并为他们赋值10和20。这时可以看到打印的结果为:
num1 = 10,num2 = 20
- 程序继续向下,进入swap方法,首先在栈区声明两个变量a和b,他们都是形参,这时将num1和num2的值分别传入,此时如蓝色字体所显示,a=10,b=20。
- 接着还是在栈区声明一个名为temp的变量,这时执行的交换过程是在swap方法中,交换的变量其实是num1和num2的拷贝值,所以方法内打印:
num1 = 20,num2 = 10
- 最后,退出这个方法,局部变量销毁,发现其实一顿操作,原先的值根本就没有改变,打印结果和原先一样:
num1 = 10,num2 = 20
引用数据类型
基本数据类型,值传递的体现是地址值的传递。
public class TransferTempTest {
public static void main(String[] args) {
//引用类型参数传递
DataTemp data = new DataTemp();
data.a = 2;
data.b = 4;
System.out.println("进行交换前:");
System.out.println("data.a = " + data.a + ",data.b = " + data.b);
data.swapClass(data);
System.out.println("进行交换后:");
System.out.println("data.a = " + data.a + ",data.b = " + data.b);
}
}
class DataTemp {
int a;
int b;
public void swapClass(DataTemp data) {
int temp = data.a;
data.a = data.b;
data.b = temp;
System.out.println("交换过程中:");
System.out.println("data.a = " + data.a + ",data.b = " + data.b);
}
}
//运行结果
进行交换前:
data.a = 2,data.b = 4
交换过程中:
data.a = 4,data.b = 2
进行交换后:
data.a = 4,data.b = 2
整个过程的内存图显示:
如图所示:
- 在堆内存中创建DataTemp类型的对象,并让栈内存中的引用变量data存储0x7788(假设地址值),指向该对象,实例变量a和b的初始值都是0。
- 让data.a=2,data.b=4,如蓝色字体显示,这时打印:
data.a = 2,data.b = 4
- 进入swapClass方法,首先在栈区声明形参变量data,将原来的data的地址值传入,红黑两个data不是同一个!!,红色data只是黑色data的拷贝值,且拷贝的是地址值。这时两个data指向同一片堆区内存,如红色箭头显示。
- 接着还是在栈区声明一个名为temp的变量,参与交换操作,这时操作的是堆区的数据,所以方法里显然打印:
data.a = 4,data.b = 2
- 最后,退出这个方法,局部变量销毁,执行的交换过程虽然是在swapClass方法中,但引用变量传入形参传递的是地址值,意味着,这时的交换操作直接对堆区对象生效,所以最终交换成立:
data.a = 4,data.b = 2
综合练习
package com.my.pac05;
public class TransferTest {
public static void main(String[] args) {
TransferTest test = new TransferTest();
test.first();
}
public void first() {
int i = 5;
Value v = new Value();
v.i = 25;
second(v, i);
System.out.println(v.i);
}
public void second(Value v, int i) {
i = 0;
v.i = 20;
Value val = new Value();
v = val;
System.out.println(v.i + " " + i);
}
}
class Value {
int i = 15;
}
//运行结果
15 0
20
整个过程的内存图显示:
总结
- 方法不能修改基本数据类型的参数,他们改变的仅仅是他们的拷贝。
- 方法可以改变对象参数的状态,因为方法可以通过对象引用的拷贝修改对象状态。
- 方法不能让对象参数引用一个新的对象,方法得到的永远都是拷贝值。
Java方法之参数传递机制的更多相关文章
- 我的Java开发学习之旅------>Java语言中方法的参数传递机制
实参:如果声明方法时包含来了形参声明,则调用方法时必须给这些形参指定参数值,调用方法时传给形参的参数值也被称为实参. Java的实参值是如何传入方法?这是由Java方法的参数传递机制来控制的,Java ...
- 深入理解Java中方法的参数传递机制
形参和实参 我们知道,在Java中定义方法时,是可以定义参数的,比如: public static void main(String[] args){ } 这里的args就是一个字符串数组类型的参数. ...
- Java高频经典面试题(第一季)四:方法的参数传递机制
考点? 方法的参数传递机制 String,包装类等对象的不可变性 方法的参数传递机制: ①形参是基本数据类型 传递数据值 ②实参是引用数据类型 传递地址值 特殊的类型:String.包装类等对象不可变 ...
- JavaSE 面试题: 方法的参数传递机制
JavaSE 面试题 方法的参数传递机制 import java.util.Arrays; public class Test { public static void main(String[] a ...
- java 对象的this使用 java方法中参数传递特性 方法的递归
一.this关键字,使用的情形,以及如何使用. 1.使用的情形 类中的方法体中使用this --初始化该对象 类的构造器中使用this --引用,调用该方法的对象 2.不写this,调用 只要方法或 ...
- 068 01 Android 零基础入门 01 Java基础语法 08 Java方法 06 参数传递问题——基本数据类型传值
068 01 Android 零基础入门 01 Java基础语法 08 Java方法 06 参数传递问题--基本数据类型传值 本文知识点:参数传递问题--基本数据类型传值 说明:因为时间紧张,本人写博 ...
- java中方法的参数传递机制
问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递.Java 编程语言只有值传递参数.当一个对象实例作为一个 ...
- 【Java基础】12、java中方法的参数传递机制
问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递.Java 编程语言只有值传递参数.当一个对象实例作为一个 ...
- java中方法的参数传递机制(值传递还是引用传递)
看到一个java面试题: 问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递.Java 编程语言只有值传递参 ...
随机推荐
- flash插件
偶尔见到别人的博客侧边栏 有一些很有意思的flash插件,也想加入到自己博客里面,这里来大概讲一下~ 一.支持js代码 首先要在 博客设置 >开启博客侧边栏公告的js代码支持,提交审核后 很快 ...
- RocketMQ 整合 DLedger(多副本)即主从切换实现平滑升级的设计技巧
目录 1.阅读源码之前的思考 2.从 Broker 启动流程看 DLedger 2.1 构建 DefaultMessageStore 2.2 增加节点状态变更事件监听器 2.3 调用 DefaultM ...
- NodeJS4-7静态资源服务器实战_缓存
浏览器发出一个请求,服务器解析出响应的结果返回给浏览器. 缓存是怎么工作的? 用户发起请求,浏览器检查本地是否存在缓存,如果第一次请求没有缓存,那就向服务器发起请求,服务器协商缓存的内容并且返回响应, ...
- chrome显示正常,IE报400的错
发现是因为参数里面有一个是中文,应该是IE没有转码,所以会报错,只要用encodeURI()实现转码即可
- CCF-CSP题解 201712-3 Crontab
做完一定要仔仔细细地看一遍题目再交,之后发现坑点只能追悔莫及.比如这次"英文缩写(不区分大小写)"\(OwQ\). 给定多个周期性执行的任务,每个任务调度执行有时间的要求.求给定时 ...
- 消息队列MQ简介
项目中要用到RabbitMQ,领导让我先了解一下.在之前的公司中,用到过消息队列MQ,阿里的那款RocketMQ,当时公司也做了简单的技术分享,自己也看了一些博客.自己在有道云笔记上,做了一些整理,但 ...
- 微信 电脑版 HOOK(WeChat PC Hook)- 技能点
CE 扫描内存数据OD 动态分析代码IDA 静态分析代码汇编 阅读OD和IDA的代码 编写inline hookC/C++ 编写dll 编写主程序逻辑MFC 编写主程序界面 源码: https://g ...
- PageRank算法小结
PageRank 这个学期选了数据挖掘的课程,期末要做一个关于链接分析算法的报告,这是PR算法的小结. 算法 PR算法基于等级权威的思想,及不仅考虑指向该网页的链接数,同时也考虑指向该网页网站的重要程 ...
- Jmeter自动化集成工具Ant的安装
一.Ant介绍 Apache Ant,是一个将软件编译.测试.部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发.由Apache软件基金会所提供.只要使用过Linux系统的读者 ...
- 整理h5移动端适配方案
<使用Flexible实现手淘H5页面的终端适配>:https://github.com/amfe/article/issues/17 <再聊移动端页面的适配>:https:/ ...