java基础知识——11.方法
这篇文章,我们来讲一下java中的方法
目录
1.什么是方法
2.方法的格式
2.1 方法的定义格式
2.1.1最简单的定义方法
2.1.2带参数的方法定义
2.1.3带返回值方法的定义
2.1.4方法定义的总结
2.2 方法的调用
2.3 方法的小结
3.方法的重载
4.方法的小练习
4.1数组遍历
4.2 数组最大值
4.3判断是否存在
4.4复制数组
5.方法的内存
5.1方法调用的基本原理内存
5.2方法传递基本数据类型的内存原理
5.3方法传递引用数据类型的内存原理
6.小结
1.什么是方法
方法:是程序中的最小的执行单元
怎么理解?我们看下面的例子:
在程序运行时,主方法中的输出语句我能只执行一条吗?显然是不可以的,必须全部执行。那么也就是说,当程序运行时,方法是最小的执行单元,不可再分。
问:什么时候用到方法?
答:重复的代码、具有独立功能的代码可以抽取到方法中
问:实际开发中,方法有什么好处?
答:可以提高代码的复用性,提高代码的可维护性
2.方法的格式
下面我们来学习一下方法的格式。
方法就是把一些代码打包在一起,用的时候进行调用。所以,我们要从方法的打包和方法的调用两方面来学习
方法的定义:把一些代码打包在一起,该过程称为方法的定义
方法的调用:方法定义后并不是直接运行的,需要手动调用才行,该过程称为方法的调用。
2.1 方法的定义格式
下面,我们来看一下方法的定义
2.1.1最简单的定义方法
最简单的定义格式如下:
public static void 方法名() {
方法体(就是打包起来的代码)
}
范例:
public static void playGame(){
System.out.println("打游戏");
}
方法的调用:
public class Method1 {
public static void main(String[] args) {
// 直接调用方法名就行
playGame();
}
public static void playGame(){
System.out.println("打游戏");
}
}
注意:方法要写在类里面,main方法的外面!!!
2.1.2带参数的方法定义
问:为什么要有带参数的方法?
答:为了代码的更灵活的使用
带参数的方法定义格式如下:
public static void 方法名(参数类型 参数名,参数类型 参数名……) {
方法体(就是打包起来的代码)
}
范例:
public static void getSum(int num1,int num2){
int result = num1 + num2;
System.out.println(result);
}
方法的调用:
public class Method1 {
public static void main(String[] args) {
// 写方法名并写入参数
getSum(10,20);
}
public static void getSum(int num1,int num2){
int result = num1 + num2;
System.out.println(result);
}
}
注意:方法调用时,参数的数量和类型必须和方法定义中小括号里面的变量一一对应,否则程序将报错
这里说两个概念:
形参:全称形式参数,是指方法定义中的参数
实参:全称实际参数,是方法调用中的参数
定义方法的技巧:
- 我要干什么?
- 我干这件事需要什么才能完成?
每次定义方法时,我们都可以问自己这些问题
2.1.3带返回值方法的定义
问:为什么要带返回值?
答:有时候我们需要方法的计算结果,所以就需要返回值
带返回值方法的定义格式如下:
public (static) 返回值类型 方法名(参数类型 参数名,参数类型 参数名……) {
方法体(就是打包起来的代码)
return 返回值;
}
调用方式:
- 直接调用:方法名(实参)
- 复制调用:整数类型 变量名 = 方法名(实参)
- 输出调用:System.out.println( 方法名(实参) )
范例:
public class Method1 {
public static void main(String[] args) {
// 赋值调用
int a = getSum1(10,20);
// 输出调用
System.out.println(getSum1(10,20));
}
public static int getSum1(int num1, int num2){
int result = num1 + num2;
return result;
}
}
2.1.4方法定义的总结
上面是方法定义的具体分类,下面总结一下:
方法定义的格式:
public static 返回值类型 方法名(参数类型 参数名,参数类型 参数名……) {
方法体(就是打包起来的代码)
return 返回值;
}
这就是标准格式,然后我们可以根据具体的情况来更改返回值类型,参数,返回语句等
2.2 方法的调用
上面讲方法的定义的时候已经讲了方法的调用,可以回看上面的内容
2.3 方法的小结
下面对方法进行一下小结
方法的定义格式(再次重复):
public static 返回值类型 方法名(参数类型 参数名,参数类型 参数名……) {
方法体(就是打包起来的代码)
return 返回值;
}
注意事项:
- 方法不调用就不执行
- 方法与方法之间是平级关系,不能互相嵌套定义
- 方法的编写顺序与其执行顺序无关
- 注意方法的返回值与return语句
- return语句下面,不能编写代码,因为永远执行不到,属于无效方法
return关键字:
- 方法没有返回值:可以省略不写。如果书写,表示结束方法
- 方法有返回值:必须要写。表示结束方法和返回结果
3.方法的重载
方法重载的定义:在同一个类中,定义多个同名的方法,这些同名的方法具有同种的功能。每个方法具有不同的参数类型和参数个数,这些同名的方法,就构成重载关系。
简单记忆:同一个类中,方法名相同,参数不同的方法。与返回值无关
参数不同:包括数量不同,类型不同,顺序不同
问:当我们调用一个同名的方法时,JVM是怎么判断我们到底是调用的哪个呢?
答:依靠参数来判定
4.方法的小练习
下面,我们来写几个方法的小练习
4.1数组遍历
需求:定义一个方法用于数组遍历,要求遍历的结果是在一行上的。例如:[11,22,33,44,55]
代码如下:
public class Test1 {
public static void main(String[] args) {
int[] arr = new int[]{11,22,33,44,55};
show(arr);
}
public static void show(int[] arr){
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+",");
}
}
}
截图如下:
4.2 数组最大值
需求:设计一个方法求数组的最大值,并将最大值返回
代码如下:
public class Test1 {
public static void main(String[] args) {
int[] arr = {65,45,2,31,56,24,96};
System.out.println("数组的最大值为:"+TheMax(arr));
}
public static int TheMax(int[] arr){
int max = arr[0];
for (int i = 0; i < arr.length; i++) {
if (arr[i] > max)
max = arr[i];
}
return max;
}
}
结果如下:
4.3判断是否存在
需求:定义一个方法判断数组中的某一个数是否存在,将结果返回给调用处
代码如下:
public class Test1 {
public static void main(String[] args) {
int[] arr = {65,45,2,31,56,24,96};
System.out.println("30在数组中存在吗?"+contains(30,arr));
}
public static boolean contains(int number ,int[] arr ){
for (int i = 0; i < arr.length; i++) {
if (arr[i] == number )
return true;
}
return false;
}
}
截图如下:
4.4复制数组
需求:定义一个方法,将数组arr中从索引from(包含form)开始,到索引to(不包含to)的元素复制到新数组中,将新数组返回。
代码如下:
public class Test1 {
public static void main(String[] args) {
int[] arr = {65,45,2,31,56,24,96};
int[] arr1 = copyOfRange(2,6,arr);
for (int i = 0; i < arr1.length; i++) {
System.out.println(arr1[i]);
}
}
public static int[] copyOfRange(int from,int to,int[] arr){
int[] arr1 = new int[to - from];
int index = 0;
for (int i = from; i <to ; i++) {
arr1[index] = arr[i];
index++;
}
return arr1;
}
}
截图如下:
5.方法的内存
下面,我们来讲一讲方法的内存
5.1方法调用的基本原理内存
在讲数组的内存时,我们讲过java的内存,下面回顾一下:
栈:方法运行时使用的内存,方法进栈运行,运行完毕出栈
堆:new出来的,都在堆内存中开辟了一个小空间
下面,我们根据具体的代码来讲解一下:
内存图如下:
分析:
当程序运行时,方法入栈,即main方法入栈,方法入栈之后,然后依次执行方法内部的内容,即创建和打印数组arr
下面,我们来看一下复杂的:
内存图如下:
分析:
程序开始运行,首先main方法入栈,然后执行eat方法,eat方法入栈,入栈之后执行study方法,所以study方法入栈,study放打印输出完成之后,study方法出栈,然后eat方法执行打印输出语句,执行完成之后,执行sleep方法,所以sleep方法入栈,sleep方法打印输出完成之后,sleep方法出栈,此时eat方法执行完毕,eat方法出栈,此时main方法执行完毕,main方法出栈,程序执行结束。
5.2方法传递基本数据类型的内存原理
基本数据类型:就是变量中存的是真实的数据
内存图如下图所示:
引用数据类型:变量中存储的是地址值
内存图如下图所示:
5.3方法传递引用数据类型的内存原理
下面,我们来看一个代码:
看下运行结果:
这个其实很简单,就直接说结论了
结论:传递基本数据类型时,传递的是真实的数据,不是地址,形参的改变,不会影响实际参数的值
下面,看一下另一个代码:
看下结果:
结论:传递引用数据类型时,传递的是地址,不是地址中的值,形参的改变,会影响实际参数的值
6.小结
这篇文章,我们学习了java的方法。怎么说呢,这部分内容不算难,是基础,多练习就好。