Java基础漏洞(四)

本文介绍了Java编程中的递归调用原理,通过示例展示了递归如何占用内存以及执行过程。接着讨论了可变参数的使用,比较了不使用和使用可变参数进行累加运算的区别。此外,还阐述了全局变量和局部变量的区别,以及对象创建的四个步骤。最后讲解了this关键字在方法调用和构造器之间的应用。
摘要由CSDN通过智能技术生成

目录

(1)递归调用的内存

(2)可变参数

       1.不用可变参数

       2. 使用可变参数 

(3)全局变量和局部变量

(4)对象的创建流程

(5)this关键字

(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)构造器");
	}
	
	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值