《疯狂Java讲义》(七)---- 方法
一 方法的参数传递机制
Java方法的参数传递方式只有一种:值传递。就是将实际参数值的副本传入方法内,而参数本身不会受到任何影响。
eg.
基本类型的值传递
public class PrimitiveTransferTest {
public static void swap(int a, int b) {
int tmp = a;
a = b;
b = tmp;
System.out.println("in swap(), a =" + a + " b =" + b);
}
public static void main(String[] args) {
int a = 6;
int b = 9;
swap(a, b);
System.out.println("after swap(), a =" + a + ", b =" + b);
}
}
输出结果:
in swap(), a =9 b =6
after swap(), a =6, b =9
所以main方法中的a和b,并不是swap方法中的a和b。
main()开始定义了a和b两个局部变量,存在main方法的栈区。当程序执行swap方法时,系统进入swap方法中,并将main方法中的a和b变量作为参数值传入swap方法,传入swap方法的只是a和b的副本,而不是a和b本身,进入swap方法后系统产生了4个变量,即main()的a和b,swap()中的a和b。
在main方法中调用swap方法时,main方法还没结束,因此系统为main和swap分配两块栈区,用于保存main和swap的局部变量。main方法中a和b变量作为参数值传入swap方法,实际上是在swap方法栈区中重新产生了两个变量a和b,并将main方法栈区中a和b变量的值分别赋给swap方法栈区的a和b参数(就是对swap方法的a和b形参进行初始化),此时,系统存在两个变量a,两个变量b,只是存在不同的方法栈区中。这就是值传递。
eg.
引用类型的值传递
public class ReferenceTransferTest {
public static void swap(DataWrap dw) {
int tmp = dw.a;
dw.a = dw.b;
dw.b = tmp;
System.out.println("in swap(), dw.a =" + dw.a + ", dw.b =" + dw.b);
}
public static void main(String[] args) {
DataWrap dw = new DataWrap();
dw.a = 6;
dw.b = 9;
swap(dw);
System.out.println("after swap(), dw.a = " + dw.a + ", dw.b =" + dw.b);
}
}
class DataWrap {
public int a;
public int b;
}
输出结果:
in swap(), dw.a =9, dw.b =6
after swap(), dw.a = 9, dw.b =6
main方法中开始调用swap方法,main方法并未结束,系统会分别开辟出main和swap两个栈区,用于存放main和swap方法的局部变量。调用swap方法时,dw变量作为实参传入swap方法,同样采用值传递的方式:把main方法里的dw变量值赋给swap方法的dw形参,从而完成swap方法的dw形参的初始化,main方法中dw是一个引用,保存了DataWrap对象的地址值,当把dw的值赋给swap的dw形参后,即swap方法的dw形参也保存这个地址值,也引用对内存中的DataWrap对象。当程序在swap方法中操作dw形参时,由于dw制式一个引用变量,故实际操作的还是对内存中的DataWrap对象。此时,不管操作main方法里的dw变量,还是操作swap方法里的dw参数,其实都是操作它所引用的DataWrap对象。
二 形参个数可变的方法
从JDK1.5之后,Java允许定义形参个数可变的参数,从而允许为方法制定数量不确定的形参。在定义方法时,在最后一个形参的类型后增加三点,则表明该形参可以接受多个参数值,多个参数值被当作数组传入。
test(int a, String... books);
《疯狂Java讲义》(七)---- 方法的更多相关文章
- 0038 Java学习笔记-多线程-传统线程间通信、Condition、阻塞队列、《疯狂Java讲义 第三版》进程间通信示例代码存在的一个问题
调用同步锁的wait().notify().notifyAll()进行线程通信 看这个经典的存取款问题,要求两个线程存款,两个线程取款,账户里有余额的时候只能取款,没余额的时候只能存款,存取款金额相同 ...
- 疯狂java讲义——继承
本文章只是记录我在学习疯狂java讲义里面,对之前java知识查缺补漏进行的总结. 方法重写 方法重写要遵循"两同两小一大"规则."两同"即方法名相同.形参列表 ...
- 《疯狂java讲义》笔记 1-5章
1.编译语言和解释语言理解,摘自李刚老师的<疯狂Java讲义>第三版: 就是说,Java和.net都是编译型有事解释型语言.编译型就是根据不同平台编译成不同的可执行机器码,编译过程中会进行 ...
- udp协议基础(转自疯狂java讲义)
第17章 网络编程 17.4 基于UDP协议的网络编程 UDP协议是一种不可靠的网络协议,它在通信实例的两端各建立一个Socket,但这两个Socket之间并没有虚拟链路,这两个Socket只是发 ...
- 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条
http://blog.csdn.net/terryzero/article/details/3797782 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条 标签: swing编程 ...
- 【Java】-NO.16.EBook.4.Java.1.011-【疯狂Java讲义第3版 李刚】- AWT
1.0.0 Summary Tittle:[Java]-NO.16.EBook.4.Java.1.011-[疯狂Java讲义第3版 李刚]- AWT Style:EBook Series:Java ...
- 【Java】-NO.16.EBook.4.Java.1.012-【疯狂Java讲义第3版 李刚】- JDBC
1.0.0 Summary Tittle:[Java]-NO.16.EBook.4.Java.1.012-[疯狂Java讲义第3版 李刚]- JDBC Style:EBook Series:Java ...
- 【Java】-NO.16.EBook.4.Java.1.006-【疯狂Java讲义第3版 李刚】- 垃圾回收
1.0.0 Summary Tittle:[Java]-NO.16.EBook.4.Java.1.006-[疯狂Java讲义第3版 李刚]- 垃圾回收 Style:EBook Series:Java ...
- 【Java】-NO.16.EBook.4.Java.1.007-【疯狂Java讲义第3版 李刚】- Java基础类
1.0.0 Summary Tittle:[Java]-NO.16.EBook.4.Java.1.007-[疯狂Java讲义第3版 李刚]- Java基础类 Style:EBook Series:J ...
- 【Java】-NO.16.EBook.4.Java.1.008-【疯狂Java讲义第3版 李刚】- 集合/容器
1.0.0 Summary Tittle:[Java]-NO.16.EBook.4.Java.1.008-[疯狂Java讲义第3版 李刚]- 集合 Style:EBook Series:Java Si ...
随机推荐
- n皇后问题<dfs>
n皇后问题指的是: n*n的国际象棋棋盘上摆放n个皇后,使其不能互相攻击, 即任意两个皇后都不能处于同一行.同一列或同一斜线上, 问有多少种摆法. 和一般n皇后问题不同的是,现在棋盘上有可能已经放了一 ...
- 搭建App主流框架_纯代码搭建(OC)
转载自:http://my.oschina.net/hejunbinlan/blog/529778?fromerr=EmSuX7PR 搭建主流框架界面 源码地址在文章末尾 达成效果 效果图 注:本文部 ...
- sql server 2008 把远程的数据库的数据转移到本地数据数据库里
如题:把远程的数据库对应表里的数据转移到本地数据数据库的对应表里 比如把192.168.188.160的DB的A表的数据转移到本地的DB的A表里 第一步:连接远程服务器前准备 exec sp_addl ...
- ActionBarSherlock,SlidingMenu
转自:http://www.chenwg.com/android/actionbarsherlock%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B.html Android3 ...
- 关于css3的calc()
么是calc()? 学习calc()之前,我们有必要先知道calc()是什么?只有知道了他是个什么东东?在实际运用中更好的使用他. calc()从字面我们可以把他理解为一个函数function.其实c ...
- Android 各层中日志打印功能的应用
1. HAL层 头文件:#include <utils/Log.h> 对应的级别 打印方法 VERBOSE LOGV()DEBUG LOGD()INFO LOGI()WARN LOGW() ...
- GB2312 编码
GB2312编码范围:A1A1-FEFE,其中汉字编码范围:B0A1-F7FE. GB2312编码是第一个汉字编码国家标准,由中国国家标准总局1980年发布,1981年5月1日开始使用.GB2312编 ...
- egret GUI 文本混排+文本链接的聊天解决方案【取巧法】
ui方面: <e:Scroller verticalScrollPolicy="auto" width="468" height="620&qu ...
- winform无法查看设计器
在代码中右键无法查看设计器.将无效的引用去除,重新生成即可.
- 关于BOM 的详细介绍
原文地址:http://blog.csdn.net/u011526599/article/details/51419182