参数传递:Java中参数的传递(此处存有争议,焦点是值传递和引用传递),此部分内容按照数据类型来分为值传递和引用传递
如果参数时基本数据类型,称之为值传递,传递过去的是值的拷贝,无论怎么改变这个拷贝,原值不会改变
public class TestParamValue {
public static void main(String[] args) {
int num = 3;
System.out.println("Before change, num = " + num);
changeData(n);
System.out.println("After changeData(n), num= " + num);
}
public static void changeData(int n) {
n = 10;
}
}
结果:3
3
public class TestParamValue2 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("Hello ");
System.out.println("before change sb="+sb);
change(sb);
System.out.println("after change sb = "+sb);
}
public static void change(StringBuffer s){
s.append("world");
}
}
结果:
Before change,num=Hello
StringBuffer sb = new StringBuffer("Hello ");
System.out.println("before change sb="+sb);
change(sb);
System.out.println("after change sb = "+sb);
}
public static void change(StringBuffer s){
s = new StringBuffer("hi ");
s.append("world");
}
}
结果:
Before change,num=Hello
例子:package com.test;
public class Fbs {
static int f(int num)
{
//assert(num >= 0);
if(num==0||num==1)
{
return num;
}
return f(num-1)+f(num-2);
}
public static void main(String[] args) {
for (int i = 0; i < 20; i++) {
int num=f(i);
System.out.println(num);
}
}
}
如果参数时基本数据类型,称之为值传递,传递过去的是值的拷贝,无论怎么改变这个拷贝,原值不会改变
public class TestParamValue {
public static void main(String[] args) {
int num = 3;
System.out.println("Before change, num = " + num);
changeData(n);
System.out.println("After changeData(n), num= " + num);
}
public static void changeData(int n) {
n = 10;
}
}
结果:3
3
public class TestParamValue2 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("Hello ");
System.out.println("before change sb="+sb);
change(sb);
System.out.println("after change sb = "+sb);
}
public static void change(StringBuffer s){
s.append("world");
}
}
结果:
Before change,num=Hello
After changeData(n), num= Hello World
public class TestParamValue3{
public static void main(String[] args) {StringBuffer sb = new StringBuffer("Hello ");
System.out.println("before change sb="+sb);
change(sb);
System.out.println("after change sb = "+sb);
}
public static void change(StringBuffer s){
s = new StringBuffer("hi ");
s.append("world");
}
}
结果:
Before change,num=Hello
After changeData(n), num= Hello
递归调用
1递归就是在过程或函数里调用自身
2在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口
3递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序
4在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序
例子:package com.test;
public class Fbs {
static int f(int num)
{
//assert(num >= 0);
if(num==0||num==1)
{
return num;
}
return f(num-1)+f(num-2);
}
public static void main(String[] args) {
for (int i = 0; i < 20; i++) {
int num=f(i);
System.out.println(num);
}
}
}