Java参数传值:
特点:
1、参数属于局部变量;
2、当对象调用方法时,参数被分配内存空间,同时要求对象为参数传值才能进行使用,即方法被调用时,参数变量必须有具体的值;
如下代码演示:在代码中,pv.tests() 是错误的,对象调用方法时,并没有为参数进行传值 ;
public class Pass_Value_Test {
int tests(int x,int y){
int sum = x+y ;
return sum;
}
public static void main(String[] args) {
//计算x+y的值
Pass_Value_Test pv = new Pass_Value_Test();
System.out.println(pv.tests(1, 10)); //正确
System.out.println(pv.tests()); //错误
}
pv.tests() 报错:The method tests(int, int) in the type Pass_Value_Test is not applicable for the arguments ()
一、基本数据类型参数的传值
基本数据类型参数的传值,该传值的类型级别不能高于该参数的级别,如不能用 float 类型的值进行传值给 int类型 的参数;
如下代码演示: 11.11f 和 111.111f 的级别高于 int x 和 int y , 所以报错;
public class Pass_Value_Test {
int tests(int x,int y){
int sum = x+y ;
return sum;
}
public static void main(String[] args) {
//计算x+y的值
Pass_Value_Test pv = new Pass_Value_Test();
System.out.println(pv.tests(1, 10)); //正确
pv.tests(11.11f, 111.111f); //错误
}
pv.tests(11.11f, 111.111f);
报错:The method tests(int, int) in the type Pass_Value_Test is not applicable for the arguments (float, float)
二、引用类型参数的传值
Java引用数据类型包括:数组、对象、接口等等;当参数是引用类型时,“ 传值 ” 传递的是变量中存放的引用,而不是变量所引用的实体;
以下代码通过 引用类型参数 为 对象 进行演示:
//创建电池类,battery
class battery {
int electricityAmount ; //创建成员变量,代表电池的剩余电量
battery(int amount){ //参数 int类型 amount
electricityAmount = amount ;
}
}
//创建收音机类,radio
class radio {
//声明方法,计算电池使用量
void openRadio(battery bt){ //创建引用类型参数:bt对象,此时对象只是声明,不具有引用和实体
bt.electricityAmount = bt.electricityAmount - 10 ; //每次调用openRadio方法,电量就减10
}
}
//创建主类
public class Pass_Value_Test {
public static void main(String[] args) {
//测试 引用类型参数的传值
//创建三个类,一个电池类Battery ,一个收音机类 Radio,一个测试类 主类
battery bas = new battery(100); //设置初始电量为 100 ;
System.out.println("电池电量为:"+bas.electricityAmount);
System.out.println("开始使用收音机·····");
radio ras = new radio();
//为 引用类型参数 bt对象 进行赋值 bas对象 ,此时 bt具有bas的引用以及bas的实体了;
ras.openRadio(bas);
System.out.println("关闭收音机,电池电量剩余:"+ bas.electricityAmount);
}
}
在以上代码中, 引用类型参数 bt ,在调用 ras.openRadio(bas); 时,就具有了和 bas 一样的引用和实体,所以在进行,
bt.electricityAmount = bt.electricityAmount - 10 ; 语句的时候, bas 里面的原实体 electricityAmount 的值也会进行改变;
也就是:改变参数变量所引用的实体,那么也会导致原对象的实体发生同样的改变 ;
需要注意的是:
改变参数中存放的 “ 引用 ” 不会影响向其传值的变量中存放的 “ 引用 ” ;
以下代码演示:
//创建电池类,battery
class battery {
int electricityAmount ; //创建成员变量,代表电池的剩余电量
battery(int amount){ //参数 int类型 amount
electricityAmount = amount ;
}
}
//创建收音机类,radio
class radio {
//声明方法,计算电池使用量
void openRadio(battery bt){ //创建引用类型参数:bt对象,此时对象只是声明,不具有引用和实体
bt.electricityAmount = bt.electricityAmount - 10 ; //每次调用openRadio方法,电量就减10
//输出 此时 bt 的引用
System.out.println("bt的引用="+bt);
}
}
//创建主类
public class Pass_Value_Test {
public static void main(String[] args) {
//测试 引用类型参数的传值
//创建三个类,一个电池类Battery ,一个收音机类 Radio,一个测试类 主类
battery bas = new battery(100); //设置初始电量为 100 ;
System.out.println("bas的引用="+bas);
System.out.println("电池电量为:"+bas.electricityAmount);
System.out.println("开始使用收音机·····");
radio ras = new radio();
ras.openRadio(bas); //为 引用类型参数 bt对象 进行赋值 bas对象 ,此时 bt具有bas的引用以及bas的实体了;
System.out.println("关闭收音机,电池电量剩余:"+ bas.electricityAmount);
battery bax = new battery(100); //设置初始电量为 100 ;
System.out.println("bax的引用="+bax);
ras.openRadio(bax);
ras.openRadio(bax);
System.out.println("bax的electricityAmount:"+ bax.electricityAmount);
System.out.println("bas的electricityAmount:"+ bas.electricityAmount);
}
}
在以上代码中,在执行 ras.openRadio(bax); 时,改变了 bt 参数的引用,此时 bt 的引用和实体就 与 bas 是不一样的了;都是bas中的引用还是原来的值,不会因为 bt 的改变而发生改变;
代码执行结果:
bas的引用=Chapter_Four.battery@7852e922
电池电量为:100
开始使用收音机·····
bt的引用=Chapter_Four.battery@7852e922
关闭收音机,电池电量剩余:90
bax的引用=Chapter_Four.battery@4e25154f
bt的引用=Chapter_Four.battery@4e25154f
bt的引用=Chapter_Four.battery@4e25154f
bax的electricityAmount:80
bas的electricityAmount:90
可变参数:
1、可变参数指:在声明方法时不给出 参数列表中从某项开始直至最后一项参数的名字和个数,但这些参数的类型必须是相同的;
2、可变参数使用 " ... " 表示若干参数,并且最后一个参数必须是方法的参数列表中的最后一个参数
如下演示:
public void test( int ... x){} //正确
public void testone(double s , int ... y){} //正确
public void errorone( int ... x , double y ){} //错误,因为最后一个参数 y 不属于参数列表中 int ... x 的最后一个参数
public void errortwo( int .... x ){} //错误,因为可变参数使用 " ... " 表示若干参数
其中 int ... x 和 int ... y 中的 x,y 是参数列表中可变参数的 “ 参数代表 ” ;
3、参数代表可以通过下标运算来表示参数列表中的具体参数,即 x[0]、x[1]、x[2]、x[n-1]、x[n] 分别表示 x 代表的 第一个 到 第n 个参数;
如下代码演示:
public class Parameter_Test {
int sum = 0;
// 可变参数的测试
void testx(int ... x) {
for(int i=1;i<x.length;i++){
sum += x[i];
}
System.out.println("sum的值="+sum);
}
public static void main(String[] args) {
Parameter_Test pt = new Parameter_Test();
pt.testx(1,11,111,1111);
pt.testx(2,22,222,2222,22222);
}
}
代码输出:
sum的值=1233
sum的值=25921
以上代码中 :
pt.testx(1,11,111,1111); 相当于方法 testx 中参数列表个数为四个,分别为 x[0]、x[1]、x[2]、x[3]
pt.testx(2,22,222,2222,22222); 相当于方法 testx 中参数列表个数为五个,分别为 x[0]、x[1]、x[2]、x[3]、x[4]
4、Java还提供了增强的for循环,如下代码演示:
public class Parameter_Test {
int sum = 0;
// 可变参数的测试
void testx(int ... x) {
for(int i:x ){
sum += i;
}
System.out.println("sum的值="+sum);
}
public static void main(String[] args) {
Parameter_Test pt = new Parameter_Test();
pt.testx(1,11,111,1111);
pt.testx(2,22,222,2222,22222);
}
}
代码输出:
sum的值=1233
sum的值=25921