递归
214–219
克隆
编写一个方法copyPerson,可以复制一个Person对象,返回复制的对象。克隆对象,注意要求得到新对象和原来的对象是两个独立的对象,只是他们的属性相同。
//编写一个方法copyPerson,可以复制一个Person对象,返回复制的对象。
//克隆对象,注意要求得到新对象和原来的对象是两个独立的对象,只是他们的属性相同
class Person{
int age;
String name;
}
//注意要求得到新对象和原来的对象是两个独立的对象,只是他们的属性相同
//编写方法的思路
//1.方法的返回类型Person
//2.方法的名字copyPerson
//3.方法的形参(Person p)
//4.方法体,创建一个新对象,并复制属性,返回即可
class MyTools{
public Person copyPerson(Person p) {
Person p2=new Person();
p2.name=p.name;
p2.age=p.age ;
return p2;
}
}
public class ss{
public static void main(String[] args){
Person p=new Person();
p.name="milan";
p.age=33;
MyTools tools=new MyTools();
Person p3=tools.copyPerson(p);
System.out.println("p age="+p.age+"\tp name="+p.name);
System.out.println("p2 age="+p3.age+"\tp2 name="+p3.name);
}
}
递归执行机制
递归(recursion)
class T{
public void test(int n) {
if(n>2) {
test(n-1);
}
System.out.print("n="+n);//调用自身后下面的代码依然运行
//每一个栈都是完整执行它的方法
}
}
public class ss {
public static void main(String[] args) {
T t1=new T();
t1.test(4);
}
}
n=2 n=3 n=4
每次执行一次自身都会在栈中上方新开辟一块空间,从上至下执行代码。
每一个栈都是完整执行它的方法.
class T{
public void test(int n) {
if(n>2) {
test(n-1);
}
else{
System.out.print("n="+n);
}
//每一个栈都是完整执行它的方法,此时3 ,4不会再进入else中,所以结果只有n=2.
}
}
public class ss {
public static void main(String[] args) {
T t1=new T();
t1.test(4);
}
}
n=2
阶乘(factorial)
一级一级往上调用,算到值后再向下返回值,直到最终结果。
方法递归调用
递归重要规则
- 执行一个方法时,就创建一个新的受保护的独立空间(栈空间)
- 方法的局部变量是独立的,不会相互影响,比如n变量
- 如果方法中使用的是引用类型变量(比如数组,对象)。就会共享该引用类型的数据.(堆里的东西变了,后面调用的数据都是变了的数据)
- 递归必须向退出递归的条件逼近,否则就是无限递归,出现
StackOverflowError,栈溢出) - 当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用,就
将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕。