(1)递归调用的内存
我们定义一个类A,在类A中定义方法test来验证递归。在程序中,当条件符合的时候会不断的递归,只有遇到终止条件时才不再递归,然后便会执行递归语句之下的语句。
如以下程序:当我们输入5时,会不断的递归直到为2时,然后便执行递归语句之下的语句输出2,然后在栈中依次执行当n=3,4,5的时候。
程序:
public class Main{
public static void main(String[] args) {
A a=new A();
a.test(5);
}
}
class A{
public void test(int n) {
if(n>2) {
test(n-1);
}
System.out.println("n="+n);
}
}
结果:
内存图:
(2)可变参数
假设我们要设计程序来进行加法运算,在类Adder编写方法add进行累加,但在方法的参数列表中参数个数是限定的,意味着我们事前要知道累加多长的长度。但是如果不知道呢?
1.不用可变参数
public class Main{//假设要设计一个程序进行累加。分别对2、3、4个数进行累加。
public static void main(String[] args) {
int a=1;
int b=2;
int c=3;
int d=4;
Adder adder=new Adder();
adder.add(a, b);
adder.add(a, b,c);
adder.add(a, b,c,d);
}
}
class Adder{//对两个数进行累加
public int add(int a,int b) {
return a+b;
}
public int add(int a,int b,int c) {//对三个数进行累加
return a+b+c;
}
public int add(int a,int b,int c,int d) {//对四个数进行累加
return a+b+c+d;
}
}
2. 使用可变参数
其实使用可变参数和使用数组差不多。
public class Main{
public static void main(String[] args) {
int []a= {1,2,3,4};//我们每次只需要改变数组就可以对其进行累加
Adder adder=new Adder();
System.out.println(adder.add(a));
}
}
class Adder{
public int add(int...a) {//使用可变参数
int end=0;
for(int i=0;i<a.length;i++) {
end=end+a[i];
}
return end;
}
}
(3)全局变量和局部变量
对于全局变量和局部变量,相信大家都很熟悉,但还是有几处需要注意的地方。
1.全局变量可以不赋值,直接使用,因为有默认值。但局部变量必须赋值后才能使用,因为没有默认值。
2.全局变量可以加修饰符,而局部变量不可以加修饰符(修饰符:如public、protected、private)
(4)对象的创建流程
图片源自韩顺平老师
当我们创建一个对象时,他会怎么分配内存,分为以下四步
(1)加载该类的信息,只会加载一次。
(2)在堆中分配空间
(3)完成对象初始化
(4)对象在堆中的地址,返回给在栈中的对象(对象的引用)
(5)this关键字
图片源自韩顺平老师
特别需要注意的是第三和第四点。
用this来调用方法,格式是this.方法名(参数列表)。
public class Main{
public static void main(String[] args) {
Test a=new Test();//创建对象a
a.testB();//在对象a中调用方法testB()
}
}
class Test{
public void testA() {
System.out.println("执行testA方法");
}
public void testB() {
this.testA();//在方法testB中用this调用testA
System.out.println("执行testB方法");
}
}
在构造器中调用另一个构造器用this(参数列表),需要注意的是this语句必须在第一句,而且只能是在同一类中一个构造器调用另一个构造器,不能在方法中。
public class Main{
public static void main(String[] args) {
Test a=new Test();//创建对象a
}
}
class Test{
public Test() {
this(1,2);//用this去调用其他的构造器,必须放在第一句
System.out.println("执行Test构造器");
}
public Test(int a,int b) {
System.out.println("执行Test(int a,int b)构造器");
}
}