第七章 Java中的方法

一、方法

1、什么是方法,有什么用?

方法(method)是可以完成某个特定功能的并且可以被重复利用的代码片段。在C语言中,方法被称为“函数”。在java中不叫函数,叫做方法。

假设你定义了一个/抽取了一个方法出来,而这个方法却无法完成某个功能,那么你抽取的这个方法毫无意义。一般一个方法就是一个“功能单元”。假设在以后的开发中,某个功能是可以独立抽取出来的,建议定义为方法,这样以后只要需要这个功能,那么直接调用这个方法即可,而不需要重复编写业务逻辑代码。

2、方法怎么定义,语法机制是什么?

[修饰符列表] 返回值类型 方法名(形式参数列表){
        方法体; 
}

注意:
①[] 符号叫做中括号,以上中括号[]里面的内容表示不是必须的,是可选的。
②方法体由Java语句构成。
③方法定义之后需要去调用,不调用是不会执行的。

1)关于修饰符列表:

修饰符列表不是必选项,是可选的。目前为止,大家统一写成:public static,后面你就理解应该怎么写了。

2)关于返回值类型:

①返回值类型可以是任何类型,只要是java中合法的数据类型就行,数据类型包括基本数据类型和引用数据类型,也就是说返回值类型可以是:byte short int long float double boolean char String......

②什么是返回值?
返回值一般指的是一个方法执行结束之后的结果。结果通常是一个数据,所以被称为“值”,而且还叫“返回值”。方法就是为了完成某个特定的功能,方法结束之后大部分情况下都是有一个结果的,而体现结果的一般都是数据。数据得有类型。这就是返回值类型。

③当一个方法执行结束不返回任何值的时候,返回值类型也不能空白,必须写上void关键字。所以void表示该方法执行结束后不返回任何结果。

④如果返回值类型“不是void”,那么你在方法体执行结束的时候必须使用 "return 值;"这样的语句来完成“值”的返回,如果没有“return 值;”这样的语句那么编译器会报错。return 值; 这样的语句作用是“返回值”,返回方法的执行结果。

⑤只要有“return”关键字的语句执行,当前方法必然结束。return只要执行,当前所在的方法结束,记住:不是整个程序结束。

⑥如果返回值类型是void,那么在方法体当中不能有“return 值;”这样的语句。但是可以有“return;”语句。这个语句“return;”的作用就是用来终止当前方法的。

⑦除了void之外,剩下的都必须有“return 值;”这样的语句。

3)关于方法名

①方法名要见名知意。(驼峰命名方式)
②方法名在标识符命名规范当中,要求首字母小写,后面每个单词首字母大写。
③只要是合法的标识符就行。

4)关于形式参数列表

①形式参数列表中的每一个参数都是“局部变量”,方法结束之后内存释放。形参的个数是:0~N个。
②形参有多个的话使用“逗号,”隔开。逗号是英文的。
③形参的数据类型起决定性作用,形参对应的变量名是随意的。

5)关于方法体

①方法体由Java语句构成。java语句以“;”结尾。
②方法体当中编写的是业务逻辑代码,完成某个特定功能。
③在方法体中的代码遵循自上而下的顺序依次逐行执行。
④在方法体中处理业务逻辑代码的时候需要数据,数据来源就是这些形参。
⑤在同一个域当中,"return语句"下面不能再编写其它代码。编写之后编译报错。

3、方法定义之后怎么调用呢?

方法必须调用才能执行。

调用的语法格式:类名.方法名(实际参数列表);

实参和形参的类型必须一一对应,另外个数也要一一对应。

4、方法执行过程中的内存变化

局部变量:只在方法体中有效,方法结束之后,局部变量的内存就释放了。

JVM三块主要的内存:栈内存、堆内存、方法区内存。

方法区最先有数据:方法区中放代码片段。存放class字节码。

堆内存:后面讲。

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

方法调用叫做:压栈。分配空间
方法结束叫做:弹栈。释放空间

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

public class MethodTest08{
	//主方法,入口
	public static void main(String[] args){
		
		//int a = 100;
		// 这个赋值原理是:将a变量中保存的100这个数字复制一份传给b变量。
		// 所以a和b是两个不同的内存空间,是两个局部变量。
		//int b = a;

		System.out.println("main begin");
		int x = 100;
		m1(x);
		System.out.println("main over");
	}
	public static void m1(int i){ // i是局部变量
		System.out.println("m1 begin");
		m2(i);
		System.out.println("m1 over");
	}
	public static void m2(int i){
		System.out.println("m2 begin");
		m3(i);
		System.out.println("m2 over");
	
	}
	public static void m3(int i){
		System.out.println("m3 begin");
		System.out.println(i);
		System.out.println("m3 over");
	}
}

以下为上段代码的执行内存图:

二、方法重载(overload)

1、什么情况下我们考虑使用方法重载机制?

当功能相似的时候,建议将方法名定义为一致的,这样代码美观,又方便编程。

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

2、代码满足什么条件的时候构成了方法重载?

条件1:在同一个类当中

条件2:方法名相同

条件3:形式参数列表不同(类型、个数、顺序)

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

3、方法重载的优点

代码美观,方便代码的编写。

三、方法递归

1、什么是方法递归?

方法自身调用自身。

2、使用递归的时候,必须添加结束条件

没有结束条件,会发生栈内存溢出错误(StackOverflowError)

原因:一直压栈,没有弹栈,栈内存不够用。   

3、会画出递归方法的内存结构图。

递归的过程当中可以将图画出来。

4、能够使用循环代替递归的尽量使用循环

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

5、当递归有结束条件,并且结束条件合法的时候,就一定不会内存溢出吗?

也不一定。可能递归的太深了。

6、分享了一些递归方面的经验

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值