天天看点

11 java中的方法

方法

方法是什么,方法有什么用
方法是就是一段普通的代码片段,并且这段代码可以完成某个特定的功能,而且可以被重复的调用/使用.
方法的作用是完成某个特殊功能并且可以重复使用的代码块,可以减少代码的重复编写提高编程效率


方法的定义
[修饰符列表] 返回值类型 方法名(形式参数列表){
		方法体; 
	}
1修饰符裂表是可选项,可以写也可以不写

2返回值类型可以是任何数据类型,如果没有返回值可以写成void,

大多数情况下都有返回值,返回值是方法执行后的结果.返回值以return 值;进行返回
只要执行了return那么当前方法就终止了,如果没有返回值直接执行return或者让方
法执行完效果是一样的.

3方法名的书写规则和规范以标识符为准

4形式参数列表可以写也可以不写也可以是多个或者一个,如果有形式参数需要传进来那么就必须写

5方法体中的语句以:结尾按从上而下依次执行,方法执行时需要数据则通过形式参数传进来


方法的调用
1 main方法不需要程序员手动调用,其他反复需要手动调用

2调用方法是如果是静态方法则是: 类名.方法名(形式参数);
 如果在同一个类中类名可以省略. 如果是实例方法则静态方法不能直接调用需要new一个实例并且 实例.方法名(形式参数);
如果同一个类中的实例方法调用实例方法那么可以直接调用,不需要实例.

3方法必须调用才能执行

4在同一个类中实例方法调用实例方法时可以不用对象.进行调用

5方法执行时其内部的语句是按从上到下顺序执行的

方法调用时内存的变化
JVM三块主要的内存:栈内存、堆内存、方法区内存。
方法区最先有数据:方法区中放代码片段。存放class字节码。
堆内存:后面讲。
栈内存:方法调用的时候,该方法需要的内存空间在栈中分配。
方法不调用是不会在栈中分配空间的。

方法只有在调用的时候才会在栈中分配空间,并且调用时就是压栈。
方法执行结束之后,该方法所需要的空间就会释放,此时发生弹栈动作。

方法调用叫做:压栈。分配空间
 方法结束叫做:弹栈。释放空间
 栈的执行顺序的后执行的方法先执行完成弹栈,所以main方法都是最后执行完毕的

栈中存储什么?方法运行过程中需要的内存,以及栈中会存储方法的局部变量。
           

方法重载overload

1.1、什么情况下我们考虑使用方法重载机制?
	当功能相似的时候,建议将方法名定义为一致的,
	这样代码美观,又方便编程。

	注意:如果功能不相似,坚决要让方法名不一致。

1.2、代码满足什么条件的时候构成了方法重载?
	条件1:在同一个类当中
	条件2:方法名相同
	条件3:形式参数列表不同(类型、个数、顺序)

	注意:
		方法重载和返回值类型无关,和修饰符列表无关。

1.3、方法重载的优点?
	代码美观
	方便代码的编写
           

2、方法递归

2.1、需要理解什么是方法递归?
	方法自身调用自身。

2.2、使用递归的时候,必须添加结束条件,没有结束条件,会发生栈内存溢出错误。
	StackOverflowError
	原因:一直压栈,没有弹栈,栈内存不够用。

2.3、会画出递归方法的内存结构图。
	递归的过程当中可以将图画出来。

2.4、能够使用循环代替递归的尽量使用循环,循环的执行耗费内存少一些,
递归耗费内存相对多一些,另外递归使用不当很容易内存溢出,JVM停止工作。
当然,只有极少数情况下,只能用递归,其它代码解决不了问题。

2.5、当递归有结束条件,并且结束条件合法的时候,就一定不会内存溢出吗?
	也不一定。可能递归的太深了。

2.6、分享了一些递归方面的经验
	在实际的开发中遇到递归导致的栈内存溢出错误是怎么办?
		第一步:先检查结束条件是否正确。
		第二步:如果正确,可以调整JVM的栈内存大小。(java -X)
           

3、我们要一味地将变量缩减吗?代码缩减吗?这样好吗?

public class Test{
	public static void main(String[] args){
		/*
		int i = 100;
		System.out.println(i);
		*/

		System.out.println(100);

		boolean flag = test();
		if(flag){
			...
		}

		// 缩减之后的
		if(test()){
			....
		}
	}

	public static boolean test(){
		return true;
	}
}

太计较变量的数量会有什么后果呢?(运行效率不会低)
	后果1:代码的可读性差。
	后果2:可读性差也可以会牵连到代码的开发效率。
	
	其实计算机内存不差这个。。。。。。

	注意:在编码过程中,有一些变量名是必须要定义的。
	因为在后面代码中还需要访问这个数据。重复的访问这个
	数据。