1 方法
1.1 定义
方法:Method,方法就是一段可以被重复利用的代码片段。并且每一个方法都会独立完成一个独立的功能。
方法的作用:代码复用。(重复的代码不需要重复的编写,这种功能的代码可以只写一份,如果需要使用这个功能的话,我们就调用这个方法。)
方法在C语言当中被称为:函数
- 方法必须先调用才能够执行。如果不调用,方法是无法执行的。main方法不需要我们调用,但是它被JVM调用。
- 方法在一个类体当中定义的时候,是没有顺序要求的。
- 方法当中不能定义方法,一个方法是定义在类体当中的。
1.2 语法规则
1.2.1 定义一个方法的语法规则
[修饰符列表] 方法的返回值类型 方法名(形式参数列表){ 方法体; }
1.2.2 关于修饰符列表:目前暂时死固定写死:public static
public表示公开的
static表示静态的
修饰符列表是个可选项(可有可无)
1.2.3 关于方法名
方法名是标识符。只要遵循标识符的命名规则和命名规范即可。
- 一般一个方法都是完成特定功能的,所以方法名一般都是以“功能”命名。例如:sumInt,表示int类型的数据求和。login,表示登录功能。
- 方法名要见名知意。(一个好的方法名,可以大大提升程序的可读性。)
- 方法名和变量名的命名规范一样,都是首字母小写,后面每个单词首字母大写。遵循驼峰命名方式。
1.2.4 返回值类型
什么是返回值
值:就是一个数据,或者成为一个结果
返回值:main方法调用了sumInt方法。那么sumInt这个方法执行结束之后,应该有一个执行结果返回给main方法。这里所说的返回结果就是返回值。a调用b,b结束的时候应该返回执行的结果给a。返回值,实际上就是返回一个数据,这个数据可能是:10、20,也可能是true或者false,还有可能是一个字符串"abc",或者字符串"def"。
1.在代码的级别,实现:值的返回
非常重要:在java代码角度,使用“return 值;”这样的语句来完成数据的返回。
返回给谁了?谁调用了,就返回给谁了。【返回给了调用者】。
“return 值;” 这个java语句的作用:将结果返回给调用者,同时所在的方法执行结束。
只要“return 值;”这个语句执行,所在的方法结束。同时将结果返回给调用者。
2.返回值类型起到的作用
返回值类型起到两个作用
- 作用1:约束返回的数据的类型,不能随意返回数据,只能返回这种类型下的数据。
- 作用2:根据方法声明的返回值类型来定义接收这个方法返回值的变量的类型。
3.方法的返回值类型,可以是哪些类型?
只要是java中的合法类型,都可以返回。例如:
- 基本数据类型
- byte short int long float double boolean char
- 引用数据类型
- String…
- void
- 表示这个方法不返回任何数据。如果一个方法只是调用它,它的执行结果你不需要,你不在乎,那么这个时候方法的返回值类型就可以写成void。但是不能什么也不写。
4.关于“return 值”这样的语句
当一个方法的返回值类型是void,那么方法体中不能写:return 值
当一个方法的返回值类型不是void,那么方法体当中就必须写:return 值
5.对于void返回值类型的方法来说,这种方法体当中可以使用“return;”语句,作用是:结束方法的执行。
6.重要的语法规则:带有关键字“return”的语句,只要执行,方法立即结束。
7.break和return的区别
break语句用来终止循环
return语句用来终止方法的执行
1.2.5 一个方法的参数
- 方法在声明的时候,小括号中的叫做:形式参数列表(形参)
public static int sum(int x, int y){} // (int x, int y) 是形式参数列表 // int x 是一个形参 // int y 是一个形参
方法在调用的时候,小括号中的叫做:实际参数列表(实参)
sum(10, 20); // (10, 20) 叫做形式参数列表 // 10 是一个实参 // 20 是另一个实参
- 形式参数列表和实际参数列表要一一对应:
- 个数要一样
- 类型要对应相同
- 形参的个数没有要求,主要看你的具体需求是什么,个数是0~N个。如果有多个的话,使用逗号隔开。“英文的逗号”
- 形参中起决定性作用的是:参数的类型。参数的名字其实就是变量名,随意的,只要是合法的标识符就行。
- 方法的形式参数列表其实就是用来接收将来调用时传递过来的“物料”。而方法的返回值就是把“物料”加工之后的“产物”。
- 方法调用的时候,传递的这个实参,实际上底层会有一个隐形的“赋值运算”,“=”等号运算。
- 方法上的每一个形参,都是局部变量。
1.2.6 关于方法的调用
如果一个方法的修饰符列表当中有static。那么调用这个方法的语法格式是:
类名.方法名(实参列表);
当“调用者”和“被调用者”在同一个类当中的时候,“类名.”可以省略。
1.2.7 方法中代码的执行顺序
- 方法体当中的代码,遵循自上而下的顺序依次逐行执行,不可能出现跳行执行。
- 上一行代码必须完全执行结束,下一行代码才能开始执行。
1.2.8 从内存的角度分析一下方法调用时候代码的执行顺序
- 栈数据结构特点:
- 先进后出/后进先出
- 栈涉及到的术语:
- 栈帧
- 栈顶元素
- 栈底元素
- 压栈(push)
- 弹栈(pop)
- 在Java的JVM(Java虚拟机)当中有一块空间(一个线程一块),叫做:VM Stack(虚拟机栈),VM Stack主要是在方法调用的时候,给该方法分配所属的内存空间。换句话说:方法调用的时候,需要的空间在VM Stack当中进行分配。
方法调用是压栈(给方法分配执行空间)
方法结束是弹栈(将之前分配的空间全部释放掉)
- 方法只定义,不去调用,这个方法是不会执行的。只有方法在调用的时候,才会给该方法分配空间,这个时候发生压栈动作,如果方法执行结束了,这个方法所属的空间就要释放掉,此时发生弹栈动作。
- 方法当中的局部变量只在当前方法中有效。因为方法结束之后,该方法所属的内存空间全部释放了。
- VMStack当中存储了“局部变量”。
2 方法重载
2.1 定义
在同一个类当中,允许方法名一致,参数列表不同,像这种情况的,就属于方法重载机制
Java编译器是允许的,方法名虽然是一样的,但是参数列表不同,Java编译器可以区分
2.2 一些问题
2.2.1 方法重载机制什么时候使用
- 在功能相似的情况下,可以把方法名定义为相同的方法名
- 如果功能A和功能B完全不一样,不相似,没关系,方法名千万别一样
2.2.2 方法重载的好处
- 代码美观
- 更便于程序员的开发
2.2.3 能构成方法重载机制 代码需要满足的条件
- 条件一:在同一个类当中
- 条件二:方法名一致
- 条件三:参数列表不同
- 个数不同算不同
- 类型不同算不同
- 顺序不同算不同
2.2.4 方法重载需要注意的问题
- 方法的重载和方法的返回值类型无关
- 方法的重载和方法的修饰符列表无关
3 方法递归
方法自己调用自己
- 对于递归来说:
- 必须要有结束条件。
- 不能无限制的递归,无限制递归会导致“栈内存溢出错误”。栈内存溢出错误之后,JVM就停止了。
- 栈内存溢出错误
- java.lang.StackOverflowError(它发生之后,JVM就退出了。)
- 递归不建议使用,因为使用递归,一旦没有结束条件,就会发生栈内存溢出错误。
- 原则:能用循环的尽量使用循环,只有当循环搞不定的时候,才会选择使用方法递归的方式。(递归比循环更耗费内存空间。)
- 有的时候,即使存在递归的结束条件,并且我们也知道这个递归条件早晚有一天会成立的,但运行的时候还是发生了栈内存溢出错误?这是为什么?这是因为递归的太深了。栈内存不够。怎么解决这个问题呀?
设置VMStack栈内存的大小,可以先考虑扩展VMStack的空间,变大一点。
- 如果变大了,还是不行,那基本上可以断定,你这个递归的结束条件是有问题的。
- 递归当中必须要掌握的练习题:计算N的阶乘。