JAVA方法参数
来源:互联网 发布:甲骨文java培训班骗局 编辑:程序博客网 时间:2024/06/06 12:55
Java 方法
Java方法是语句的集合,它们在一起执行一个功能。
- 方法是解决一类问题的步骤的有序组合
- 方法包含于类或对象中
- 方法在程序中被创建,在其他地方被引用
方法的定义
一般情况下,定义一个方法包含以下语法:
修饰符 返回值类型 方法名(参数类型 参数名){
…
方法体
…
return 返回值; }
其中参数类型:参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
通过值传递参数
调用一个方法时候需要提供参数,你必须按照参数列表指定的顺序提供。
例如,下面的方法连续n次打印一个消息:
estVoidMethod.java 文件代码:
public static void nPrintln(String message, int n) { for (int i = 0; i < n; i++) { System.out.println(message); }}
命令行参数的使用
有时候你希望运行一个程序时候再传递给它消息。这要靠传递命令行参数给main()函数实现。
命令行参数是在执行程序时候紧跟在程序名字后面的信息。
CommandLine.java 文件代码:
public class CommandLine { public static void main(String args[]){ for(int i=0; i<args.length; i++){ System.out.println("args[" + i + "]: " + args[i]); } }}
可变参数
JDK 1.5 开始,Java支持传递同类型的可变参数给一个方法。
方法的可变参数的声明如下所示:
typeName... parameterName
在方法声明中,在指定参数类型后加一个省略号(…) 。
一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。
java中方法的参数传递机制
无论是什么语言,要讨论参数传递方式,就得从内存模型说起,主要是我个人觉得从内存模型来说参数传递更为直观一些。闲言少叙,下面我们就通过内存模型的方式来讨论一下Java中的参数传递。
这里的内存模型涉及到两种类型的内存:栈内存(stack)和堆内存(heap)。基本类型作为参数传递时,传递的是这个值的拷贝。无论你怎么改变这个拷贝,原值是不会改变的。看下边的一段代码,然后结合内存模型来说明问题:
public class ParameterTransfer { public static void main(String[] args) { int num = 30; System.out.println("调用add方法前num=" + num); add(num); System.out.println("调用add方法后num=" + num); } public static void add(int param) { param = 100; }}
这段代码运行的结果如下:
调用add方法前num=30调用add方法后num=30
程序运行的结果也说明这一点,无论你在add()方法中怎么改变参数param的值,原值num都不会改变。
下边通过内存模型来分析一下。
当执行了int num = 30;这句代码后,程序在栈内存中开辟了一块地址为AD8500的内存,里边放的值是30,内存模型如下图:
执行到add()方法时,程序在栈内存中又开辟了一块地址为AD8600的内存,将num的值30传递进来,此时这块内存里边放的值是30,执行param = 100;后,AD8600中的值变成了100。内存模型如下图:
地址AD8600中用于存放param的值,和存放num的内存没有任何关系,无论你怎么改变param的值,实际改变的是地址为AD8600的内存中的值,而AD8500中的值并未改变,所以num的值也就没有改变。
以上是基本类型参数的传递方式,下来我们讨论一下对象作为参数传递的方式。
先看下边的示例代码:
public class ParameterTransfer { public static void main(String[] args) { String[] array = new String[] {"huixin"}; System.out.println("调用reset方法前array中的第0个元素的值是:" + array[0]); reset(array); System.out.println("调用reset方法后array中的第0个元素的值是:" + array[0]); } public static void reset(String[] param) { param[0] = "hello, world!"; }}
运行的结果如下:
调用reset方法前array中的第0个元素的值是:huixin调用reset方法后array中的第0个元素的值是:hello, world!
当对象作为参数传递时,传递的是对象的引用,也就是对象的地址。下边用内存模型图来说明。
当程序执行了String[] array = new String[] {“huixin”}后,程序在栈内存中开辟了一块地址编号为AD9500内存空间,用于存放array[0]的引用地址,里边放的值是堆内存中的一个地址,示例中的值为BE2500,可以理解为有一个指针指向了堆内存中的编号为BE2500的地址。堆内存中编号为BE2500的这个地址中存放的才是array[0]的值:huixin。
当程序进入reset方法后,将array的值,也就是对象的引用BE2500传了进来。这时,程序在栈内存中又开辟了一块编号为AD9600的内存空间,里边放的值是传递过来的值,即AD9600。可以理解为栈内存中的编号为AD9600的内存中有一个指针,也指向了堆内存中编号为BE2500的内存地址,如图所示:
这样一来,栈内存AD9500和AD9600(即array[0]和param的值)都指向了编号为BE2500的堆内存。
在reset方法中将param的值修改为hello, world!后,内存模型如下图所示:
改变对象param的值实际上是改变param这个栈内存所指向的堆内存中的值。param这个对象在栈内存中的地址是AD9600,里边存放的值是BE2500,所以堆内存BE2500中的值就变成了hello,world!。程序放回main方法之后,堆内存BE2500中的值仍然为hello,world!,main方法中array[0]的值时,从栈内存中找到array[0]的值是BE2500,然后去堆内存中找编号为BE2500的内存,里边的值是hello,world!。所以main方法中打印出来的值就变成了hello,world!
- java方法参数传递
- java 可变参数方法
- JAVA 参数传方法
- Java多参数方法
- Java方法参数传递
- Java方法输出参数
- java方法参数
- JAVA 可变参数方法
- Java 方法参数传递
- java方法参数
- java可变参数方法
- java 方法可变参数
- Java可变参数方法
- Java方法参数传递
- Java之方法参数
- Java方法参数
- Java可变参数方法
- Java方法参数传递
- 针对recyclerView的adapter封装
- ndarray数组的索引与切片
- Linux下开发文件规范常用处理
- JVM知识点总览-中高级Java工程师面试必备
- HTML5语义标签
- JAVA方法参数
- Android Gradle项目同步失败错误
- Python3之Django Web框架F对象,Q对象
- Asia “New Retail” Forum 2018亚洲新零售峰会举办通知
- 1, 从PHP 到python 到Django
- JAVA架构师入门教学视频,linux nginx dubbox zookeeper activemq storm FastDFS等
- openssl编程之服务端
- pdaf添加实例(2p7,type2)
- 解决Ubuntu主机文件不能用22/tcp端口下载的解决