一、什么是方法,为什么会有方法?
现在有两个需求,需要计算100和200的和,还有300和400的和。
//需求1:求100和200的和
int x =100;
int y =100;
int z = x + y;
//需求2:求300和400的和
int a =300;
int b =400;
int c = a+b
需求1和需求2在本质上是一样的,本来就可以只写一次的,如果没有方法,那么就会存在复用性很差。所以可以将上面写到方法里面,然后用变量去接受。
方法是一段可以重复利用的代码片段,并且这个代码片段是可以完成某个特定功能的,可以重复利用的代码片段。
注意:x、y、z在方法中都属于局部变量,方法结束以后,局部变量占用的空间会自动结束。
二、方法怎么定义,语法机制是什么?
[访问修饰符] 返回值 方法名(形式参数){
方法体;
}
注意:
(1)返回值类型可以是任何类型,基本数据类型和引用数据类型。
(2)返回值一般指的是一个方法执行结束之后的结果。方法就是为了完成某个特定的功能,方法结束之后大部分情况下都是有一个结果的,而体现结果的一般都是数据。数据得有类型,这就是返回值类型。
(3)当方法不返回任何值的时候,需要写上void。
(4)如果返回值类型“不是void”,那么在方法体执行结束的时候必须使用"return值";这样的语句来完成“值”的返回,如果没有"return值;"这样的语句编译器就会报错。
(5)如果返回值类型未void,那么方法体中可以写”return;“
(6)形式参数列表
形式参数列表中的每一个参数都是“局部变量",方法结束之后内存释放,形参的个数是:0~N个。
新参有多个的话使用"逗号,"隔开,逗号是英文的,形参的数据类型起决定性作用,形参对应的变量名是随意的。
(7)方法体
由Java语句构成。java语句以“;”结尾。方法体当中编写的是业务逻辑代码,完成某个特定功能,在方法体中的代码遵循自上而下的顺序依次逐行执行。在方法体中处理业务逻辑代码的时候需要数据,数据来源就是这些形参。
三、方法定义之后,如何调用?
//方法必须调用才能执行,语法是什么?
类名.方法名(实际参数列表);
注意:(1)实际参数和形式参数的类型必须要一一对应,个数要对应。
(2)如果返回值是int类型,可以用double接收吗?可以的,因为Int为小容量,double为大容量,自动类型转换。
(3)当一个方法有返回值的时候,可以不接受吗?可以,你可以返回值,我可以选择不这个值。返回之后内存马上释放,因为没有变量去接受。
Methord.sum(100,200);
四、在调用方法的时候类名什么时候省略掉?
在同一个类中,A方法调用B方法的时候,类名可以省略。如果不在同一个类中,类名.不可以省略。
Public class MethodTest{
Public static void main(String [] args){
sayHello();
Myclass.sayHello()
}
Public void sayHello(){
System.out.println("Hello");
}
}
Class Myclass{
Public void sayHello(){
System.out.println("Hello");
}
}
五、方法执行过程中内存如何变化的
(1)JVM
首先警告编译阶段形成了.class文件,然后有类加载器classloader去加载.class文件到JVM虚拟机的方法区当中,虽然叫方法区,但是和方法没有半毛钱关系,虚拟机寻找main方法,从main方法中开始执行,main方法的内存会分配到栈中。
(2)方法执行过程中内存是如何变化的:
方法调用时:压栈,分配空间。
方法结束时:弹栈,释放空间。
(3)栈中存储的是什么?
栈中存储的是方法执行的空间和存储方法的局部变量。
六、方法重载
(一)没有方法重载的代码
public int sum(int a,int b ){
int sum = 0 ;
sum = a+b;
return sum ;
}
public double sum1(double a ,double b){
double sum = 0;
sum = a+b;
return sum;
}
没有方法重载的代码的缺点:
(1)代码不美观
(2)程序员需要记忆更多的方法名称,比较累。
如果使用方法重载机制,解决之前的两个缺点:
(1)代码整齐美观
(2)"功能相似"的,可以让"方法名相同",更易于以后的代码编写。
(二)什么时候会考虑方法重载?
在同一个类当中,如果"功能1"和"功能2"他们的功能是相似的,那么可以考虑将他们的方法名一致,这样代码既美观,又便于后期的代码编写。
(三)什么时候代码会发生方法重载?
条件1:在同一个类当中。
条件2:方法名相同
条件3:参数列表不同
参数的个数不同算不同,参数的类型不同算不同,参数的顺序不同算不同。
(四)方法重载和返回值类型没有关系,同时也和修饰符列表没有关系。
Public static int m5(){
Return 1;
}
Public static double m5(){
Return 0.5;
}
Int m6(){
}
Public static double m6(){
Return 0.5;
}
七、方法的递归
(1)什么是方法的递归?
方法自己调用自己,这就是方法递归。
(2)当递归时程序没有结束条件,一定会发生栈溢出错误,所以递归一定要有结束条件。
(3)如果递归是有结束条件,就一定不会发生栈溢出错误吗?
不一定。有可能递归的太深了,导致内存不够用了。
(4)在实际开发中,如果有一天遇到了StackOverflowError,你怎么解决这个问题?
首先,第一步:
先检查递归的结束条件对不对,如果递归的结束条件不对,必须对条件进一步的修改,直到正确为止。
第二步:如果递归的条件没有问题,怎么办?
这个时候可以调整JVM的栈内存初始化大小,可以将栈内存的空间调整的大一点。
第三部:调整了大小,如果运行还有错误,只能继续扩大栈的内存大小。
八、判断以下方法是否合格?
Public class MyClass{
Public static int main(String [] args){
Boolean flag = true;
If(flag){
System.out.println("哈哈哈");
}
}
}
分析:编译器不会去判断flag是不是true,他只是认为flag是boolean类型的,if语句有可能执行也有可能不执行,不执行的话,就没有办法返回return了,所以会报错。
(2)如果我们在return后面写值呢?
因为在reurn后面写值就会无法访问了。
九、总结
我个人感觉方法就是为了方便程序员开发,对代码进行封装的一种机制,这样做有利于对代码的复用,减少内存的开销,其实它和数学的函数很相似,都是有一种映射关系在里面,它是接受变量,变量又是存储数据的,同时方法里面可以写控制语句,方法名又是标识符,说到底就是把变量,标识符,控制语句等的一种杂烩。同时根本上是对数据的一种处理。