文章目录
JAVA方法
- 方法的基础语法
- 方法的重载机制overload
1. 方法的有关概念:
- 方法的本质:方法就是一段代码片段,并且这段代码片段可以完成某个特定的功能,并且可以被重复使用。
- 方法对应的英语单词:Method
- 方法在C语言中叫做函数/Function
- 方法定义在类体当中,在一个类当中可以定义多个方法,方法编写的位置没有先后顺序,可以随意
- 方法体中不能再定义方法
- 方法体由Java语句构成,方法体当中的代码遵守自上而下的顺序依次执行
2.方法的定义,语法结构:
[修饰符列表] 返回值类型 方法名 (形式参数列表){
方法体;
}
2.1 关于修饰符列表
- 可选项,不是必须的
- 目前统一写成:【public static】
- 方法的修饰符列表当中“有static关键字”的话,怎么调用这个方法
– 类名.方法名(实际参数列表)
2.2 返回值类型
- 什么是返回值
- 一个方法是可以完成某个特定功能的,这个功能结束之后大多数都是需要返回最终执行结果,执行结果可能是一个具体存在的数据,而这个具体存在的数据就是返回值
- 返回值类型
- 返回值都是一个具体存在的数据,数据都是有类型的,此处需要指定的是返回值的具体类型
- 返回值类型可以指定哪几类
- Java任意一种类型都可以,包括基本数据类型和所有的引用数据类型
- 也可能这个方法执行后不返回任何数据,Java中规定,当一个方法执行结束之后不能返回任何数据的话,返回值类型位置必须编写:void关键字
- 返回值类型若不是void,表示这个方法执行结束之后必须返回一个具体的数值,当方法执行结束的时候没有返回任何数据的话编译报错。代码:“return 数值;”,并且要求返回的“值”的数据类型必须和“方法的返回值类型”一致,不然编译器报错。
- 返回值类型是void的时候,在方法体当中不能编写“return 值 ;”这样的语句,但是要注意可以编写“return ;”这样的语句
- 返回值不是void的时候
- 返回值不是void的时候,要求方法必须保证“return 值;”语句来完成值的返回,如果没有“return 值;”编译报错
- 一个方法有返回值的时候,当我们调用这个方法的,方法返回了一个值,对于调用者来说,这个返回值可以选择接收,也可以选择不接收。但是大部分情况下我们都是选择接收的。
2.3方法名
- 只要是合法的标识符就行
- 方法名最好见名知意
- 方法名最好是动词
- 方法名首字母要求小写,后面每个单词首字母大写
2.4 形式参数列表:简称形参
- 形参是局部变量
- 形参的个数可以是:0 ~ n 个
- 多个形参之间用“逗号”隔开
- 形参中起决定性作用的是形参的数据类型,形参的名字就是局部变量的名字。
- 方法在调用的时候,实际给这个方法传递的真实数据被称为:实际参数,简称实参
- 实参列表和形参列表必须满足:数量相同,类型对应相同,类型不同的时候要求能够进行相应的自动类型转换
2.5 方法体
- 方法体必须由大括号括起来,方法体当中的代码有顺序,遵循自上而下的顺序依次执行
- 方法体有java语句构成,每个java语句以";"结尾
2.6 方法怎么调用
-
方法只定义不去调用是不会执行的,只有在调用的时候才会执行
-
语法规则:《方法的修饰符列表当中有static》
类名.方法名(实参列表);<这是一条Java语句,表示调用某个类的某个方法,传递这样的实参。>
如果被调用的方法与要执行的方法在同一个类中类名. 可以省略,否则不可以省略
package methodtest;
//public表示公开的
//class表示定义类
//MethodTest02是一个类名
public class MethodTest02 {//表示定义一个公开的类,起名MethodTest02
// 类体
// 类体中不能直接编写Java语句,除声明变量之外
// 方法出现在类体当中
// 方法
// public表示公开的
// static表示静态的
// void表示方法执行结束之后不返回任何数据
// main是方法名:主方法
// (String[] args):形参列表,其中String[]是一种引用数据类型,args是一个局部变量的变量名
// 所以以下只有args这个局部变量的变量名是随意的
// 主方法就需要这样固定编写,这是程序的入口
public static void main(String[] args){
//main方法是JVM负责调用的,是一个入口,可以在这里编写java语句来调用其他的方法,一个方法可以重复调用
// 调用MethodTest02的sum方法,传递两个实参
MethodTest02.sum(10,20);//(10,20)实参列表
}
// 自定义方法,不是程序的入口
// 方法作用:计算两个int类型数据的和,不要求返回结果,但是要求将结果直接输出到控制台
// 修饰符类型:public static
// 返回值类型:void
// 方法名:sum
// 形式参数列表:(int x,int y)
// 方法体:主要任务是求和之后输出计算结果
public static void sum(int i ,int j){//(int i ,int j)形参列表
System.out.println(i + "+" + j + "=" + (i+j ));
}
}
2.7深入return语句
- 带有return关键字的Java语句只要执行,所在的方法执行结束
- 在""同一个作用域"当中,return语句下面不能编写任何代码,因为这些代码永远都执行不到
- 如果无法保证“return 值 ;”会执行,编译会报错
- "return;"语句出现在返回值为void的方法当中主要是为了用来结束当前方法
3.方法在执行过程当中,在JVM中的内存分配
方法只定义,不调用,是不会执行的,并且在JVM中也不会给该方法分配运行所属的内存空间。只有在调用时才会给这个方法分配所属的内存空间
3.1在JVM内存划分上有这样三块主要的内存空间
- 方法区内存
- 堆内存
- 栈内存
3.2关于 “栈” 数据结构:
- 栈:stack,是一种数据结构
- 数据结构反映的是数据的存储形态
- 常见的数据结构:数组、队列、栈、链表、二叉树、哈希表/散列表
3.3 方法执行内存分析
- 方法代码片段属于.class字节码文件的一部分,字节码文件在类加载的时候,将其放到了方法区当中。所以JVM中的三块主要的内存空间中方法区内存最先有数据,存放了代码片段
- 代码片段虽然在方法区内存当中只有一份,但是可以被重复调用。每一次调用这个方法的时候,需要给该方法分配独立的活动场所,在栈内存中分配。【栈内存中分配方法运行的内存空间】
- 方法在调用的瞬间,会给该方法分配内存空间,会在栈中发生压栈动作,方法执行结束之后,给该方法分配的内存全部释放,此时发生弹栈动作。
- 压栈:给对方分配内存空间
- 弹栈:释放该方法的内存空间
- 局部变量在“方法体”中声明。局部变量运行阶段内存在栈中分配
- 方法调用的时候,在参数传递的时候,实际上传递的是变量中保存的那个值传过去了
- 栈内存:主要存储局部变量
4.方法重载机制
方法重载又被称为:overload
4.1 满足方法重载的条件
- 在同一个类当中
- 方法名相同
- 参数列表不同:数量不同,顺序不同,类型不同
4.2方法重载和什么有关系和什么无关系
- 方法重载和方法名+参数列表有关系
- 方法重载和返回值类型无关
- 方法重载和修饰符列表无关
5.方法递归
-
方法自身调用自身
a(){
a();
}
-
递归是很耗费内存的,递归算法可以不用的时候尽量别用。
-
递归必须有结束条件,没有结束条件一定会发生栈内存溢出错误。
-
递归即使有了结束条件,即使结束条件正确,也可能会发生栈内存溢出错误,因为溢出的太深了
-
递归可以不使用尽量别用,
-
但是有些情况下该功能的实现必须依靠递归方式,例如:目录拷贝
package methodtest;
public class RecursionTest01 {
// 5的阶乘
public static void main(String[] args){
int n = 5;
int retValue = method(n);
System.out.println(retValue);
}
public static int method(int n){
if(n == 1){
return 1 ;
}
return n * method(n-1);
}
}