方法的定义和概念:
方法是什么:某个功能的代码只需要写一遍,要使用这个功能只需要给这个功能传递数据,这个功能完成后返回的一个最终结果,就是方法,使用这个方法我们称为“调用/invoke”
方法就是一段代码片段,并且这段代码可以被重复的使用,完成某个特定的功能。
方法是定义在类体当中的,不能定义在方法之中。类体当中的方法没有先后顺序,可以随意。
方法的语法结构:
【修饰符列表】返回值类型 方法名(形式参数列表){
方法体
}
返回值的类型:返回值是一个具体存在的数据,数据都是有类型的,此外需要指定的是返回值的具体类型。
返回值类型可以指定的类型:java中任意一种类型都可以,包括基本数据类型还有所有的引用数据类型。
也可能这个方法在执行结束以后不返回任何数据,java中规定,当一个方法执行结束之后不返回任何数据的话,返回值类型位置必须编写:void关键字
返回值类型可能是:byte、short、int、long、string、float、double、char、void
返回值类型若不是void,表示这个方法执行结束之后必须返回一个具体的数值。当方法执行结束的时候没有任何数据的话编译器就会报错。
运用“return 值”来返回,要求之“值”的数据类型必须和方法的“返回值类型”一致,不然编译器报错
返回值类型是void的时候,方法体之中不能编写return语句,但是注意可以编写“return;”
只要带有return关键字的语句执行,那么return执行后,该方法执行结束。
方法名:
方法名只要是合法的标识符就行,最好见名知意,方法名最好是动词,首字母要求小写,后边每一个单词的首字母大写。
形式参数列表(形参):形参是局部变量,形参是局部变量 int a, double b, float c ,string d... 形参的个数可以是0-n, 多个形参之间可以用“,”隔开,形参中起决定作用的是形参的数据类型,形参的名字就是局部变量的名字。
方法在调用的时候,实际给这个方法传递的真实数据被称为:实际参数(实参)
实参列表和形参列表必须满足:数量相同, 类型对应相同
方法体由{}包括起来,方法体当中的代码是由顺序的,遵循自上到下的顺序依次执行。并且方法由java语句构成,每一个java语句由“;”结尾。
方法的调用:
方法之定义不去调用时是不会执行的,只有在调用的时候才会执行。
方法的修饰符列表当中由“static”关键字,完整的调用方式是“类.方法名(实参)". 在由static关键字的时候,可以省略类名,然后直接调用方法。
但是!在调用别的类中的方法时,不能省略类名
一个方法在有返回值的时候,当我们调用一个方法的时候,对于调用者来说可以选择接收,也可以选择不接收。但大部分情况下,我们都是选择接收的。一般情况下,我们定义一个变量去接收返回值。
深入return语句:
带有return关键字的java语句只要执行,所有的方法执行结束。
在”同一个作用域“当中,return语句下面不能编写任何代码,因为这些代码永远执行不到,所以编译报错。
return出现在返回值为void类型的方法之中,只要是为了终止方法的运行。
方法在执行过程当中,在JVM之中的内存是如何分配?
1.方法只定义但是不调用,是不会执行的,并且在JVM之中也不会给该方法分配“运行所属”的内存空间。只有在方法调用的时候,才会动态的给这个方法分配内存空间。
2.在JVM内存划分上有这样三块主要的内存空间:方法区内存、堆内存,栈内存
3.关于栈数据结构:
栈结构:stack,是一种数据结构
数据结构反应的是数据的储存形态
数据结构是独立的学科,不属于任何编程语言的范畴,不过在大多数编程语言当中要使用数据结构。
作为开发者需要提前精通:数据结构 + 算法
常见的数据结构:数组、队列、栈、链表、二叉树、哈希表、散列表等
4.方法代码片段存在哪里? 方法执行的时候执行过程的内存在哪里分配?
方法代码片段属于.class字节码文件的一部分,字节码文件在类加载的时候,将其放在了方法区当中。所以JVM中的三块主要的内存空间中方法区内存最先有数据,存放了代码片段。
代码片段虽然在方法区内存当中只有一份,但是可以被重复调用,每一次调用该方法的时候需要给方法分配独立的活动场所,在栈内存中分配。【栈内存中分配方法运行的所属内存空间】
5.方法在调用的时候,会给该方法分配内存空间,会在栈中发生压栈动作,方法执行结束后,会给该方法的内存空间全部释放,发生弹栈动作。
*压栈:给方法分配内存
*弹栈:释放该方法的内存空间
6.局部变量在“方法体”中声明,局部变量运行阶段内存在栈中分配。
二
方法初步:
**方法在调用的时候,传递参数的同时,传递的不是变量的名称,而是变量的“值”,在栈内存当中,一个方法无法调用另一个方法的参数名称,只能传递“值”。
方法的重载机制(overload):
功能不同但是却功能相似的情况下,方法的重载机制可以让代码更加的美观。这种机制就是重载机制(overload)。
public class partOverload {public static void main(String[] args) {System.out.println(sum(1,2));System.out.println(sum(1l,2l));System.out.println(sum(1.0,2.0));}public static int sum (int a,int b) {return a+ b;}public static long sum (long a, long b){return a + b;}public static double sum(double a, double b){return a + b;}
}
方法重载被称为overload
功能相似的时候,尽可能让方法名相同,但是功能相同/不相似的时候,尽可能让方法名不同。
什么条件满足以后构成了方法重载呢?
*在同一个类中
*方法名相同
*参数列表不同:数量不同、顺序不同、类型不同
方法重载与什么有关,与什么无关?
**方法重载何方法名+参数列表有关系,与返回值类型无关,与修饰符类型无关。
(即返回值类型不同,无法使用方法重载,修饰符类型不同,无法调用方法重载)
方法递归调用:
1.什么是递归?
递归就是方法本身自己调用自己
2.递归是很耗费栈内存的,递归算法可以不用就尽量不要使用
3.栈内存内存溢出时产生错误,JVM将停止工作。
4.递归必须有结束条件,没有结束条件一定会发生栈内存溢出错误。
5.递归即使有了结束条件,结束条件正确,也会发生栈内存溢出错误,可能是因为递归的太深了导致压栈使得栈内存发生溢出。
public class partCircle {public static void main(String[] args) {circle(1);}public static void circle(int i){i++;System.out.println("begain");if(i<5){circle(i);}else{System.out.println("end");}}
}
直接利用递归来计算累减
public class partCircle2 {public static void main(String[] args) {int sum = sum(20);System.out.println(sum);}public static int sum(int n){if(n == 1){return 1;}return n +sum(n-1);}
}