方法
* 方法的基础语法
应该在java语言当中有这样的一种机制:
---某个功能代码只需要写一遍。
---要使用这个功能,只需要给这个功能传递具体的数据。
---这个功能完成后返回一个具体的结果。
这样代码就可以充分利用了,提高代码复用性、【这就是“方法” 】
方法,对应的英语单词是:Method,方法在c语言中叫做函数/Function
方法定义在类体当中,在一个类中可以定义多个方法,方法编写的位置没有先后顺序,可以随意。
方法体当中不能再定义方法
1、方法怎么定义
语法结构:
[ 修饰符列表 ] 返回值类型 方法名(形式参数列表){
方法体;
}
2、对以上的语法进行解释说明
2.1 关于修饰列表
*可选项,不是必须的
*public ststic 【以后讲】
*方法的修饰符列表当中有static关键字的话,怎么调用这个方法?
------类名.方法名(实际参数列表);
2.2 返回值类型
*什么是返回值?一个方法是可以完成某个特定功能的,这个功能结束后大多数都是需要返回最终的执行结果,执行结果肯是一个具体存在的数据。
而这个具体存在的数据就是就是返回值。
*
*返回值类型?
返回值是一个具体存在的数据,数据都是有类型的,此处需要指定的是返回值的具体类型。
*返回值类型都可以指定哪些类型呢?java任意一种类型都可以,包括基本数据类型和所有的引用数据类型。
*也可能这个方法执行结束之后不返回任何数据,java中规定,当一个方法执行结束之后不返回任何数据的话,返回值类型位置必须编写:void关键字
*返回值类型是void的时候,在方法体当中不能编写“return 值;”这样的语句。但是要注意可以编写“return ;”这样的语句。
*只要带有return关键字的语句执行,return语句所在的方法结束。
2.3、方法名:
*只要是合法的标识符就行
*方法名最好见名知意,方法名最好是动词
*方法名首字母要求小写,后面每个单词首字母大写
2.4、形式参数列表:简称形参
*形参是局部变量 int a ,double b,float c,String s......
*形参的个数可以是:0-N个
*多个形参之间用“逗号”隔开
*形参中起决定性作用的是形参的数据类型,形参的名字只是一个标识符,形参的名字就是局部变量的名字
*方法在调用的时候,实际给这个方法传递的真实数据被称为:实际参数,简称实参
*实参列表和形参列表必须满足:
---数量相同
---类型对应相同
3、方法怎么调用
方法只定义不去调用时不会执行的。只有在调用的时候才会执行。
语法规则:《方法的修饰符列表当中有static》
类名.方法名(实参列表);//这是一条java语句,表示调用某个类的某个方法,传递这样的实参。
有点时候“类名.”可以省略,什么情况下可以省略?
m1(){
m2();
}
m1方法和m2方法在同一个类体当中的时候,“类名.”可以省略不写
方法的调用不一定在main方法中,可以在其他方法中。只要是程序可以执行到的位置,都可以取调用其它方法。
方法调用的时候实参和形参要求个数对应相同,数据类型对应相同。类型不同的时候要求能进行自动类型转换。
建议在一个java源文件当中只定义一个class,比较清晰。
一个方法有返回值的时候,当我们调用这个方法的时候,方法返回了一个值,对于调用者来说,这个返回值可以选择接收,也可以选择不接收。但是大部分情况下选择接收。
4、方法在执行过程当中,在jvm中的内存是如何分配的?
4.1、方法只定义,不调用,是不会执行的,并且在JVM中也不会给该方法分配“运行所属”的内存空间。只有在调用这个方法的时候,才会动态的给这个方法分配所属的内存空间。
4.2、在jvm内存划分上有这样三块主要的内存空间:
*方法区内存
*堆内存
*栈内存
4.3、关于栈数据结构
*栈:stack,是一种数据结构
*数据结构反应的是数据的存储形态
4.4、方法执行的时候代码片段存在哪里?方法执行的时候执行过程的内存在哪里分配?
*方法代码片段属于.class字节码文件的一部分,字节码文件在类加载的时候,将其放到了方法区当中。所以JVM中的三块主要的内存空间中方法区内存最先有数据。存放了代码片段。
*代码片段虽然在方法区内存中只有一份,但是可以被重复调用。
每一次调用这个方法的时候,需要给该方法分配独立的活动场所,在栈内存中分配。【栈内存中分配方法运行的所属内存空间】
4.5、方法在调用的瞬间,会给该方法分配内存空间,会在栈中发生压栈动作,方法执行结束之后,给该方法分配的内存空间全部释放,此时发生弹栈动作。
*压栈:给方法分配内存
*弹栈:释放该方法的内存空间
4. 6、 局部变量在“方法体”中声明。局部变量在运行阶段内存在栈中分配。
5、方法
-
方法执行过程中的内存分配
注意:在EditPlus当中,字体颜色是红色的表示一个类的名字,并且这个类是JavaSE类库自带的。我们自定义的类,字体是黑色的,是标识符。
其实JavaSE类库中自带的类,例如:String.class、System.class,这些类的类名也是标识符。只要是类名就一定是标识符。
重点:方法调用的时候,在参数传递的时候,实际上传递的是变量中保存的那个“值”传过去了。
5.1* 方法的重载机制 :
5.1.1、方法重载又被称为: overload
5.1.2、什么时候考虑使用方法重载?
功能相似的时候,尽可能让方法名相同。【但是,功能不同/不相似的时候,尽可能让方法名不同 。】
5.1.3、什么条件满足之后构成方法重载?
*在同一个类当中
*方法名相同
*参数列表不同 --数量不同 --顺序不同 --类型不同5.1.4、方法重载和什么有关系,和什么没有关系?
*方法重载和方法名+参数列表有关系
*方法重载和返回值类型无关
*方法重载和修饰符列表无关
5.2* 方法的递归调用
5.2. 1、什么是递归?
方法自身调用自身。
a( ){
a( );
}
5.2.2、递归是很耗费栈内存的,递归算法可以不用的时候尽量别用。
5.2.3、递归必须有结束条件,没有结束条件一定会发生栈内存溢出错误。
5.2.4、递归即使有了结束条件,即使结束条件是正确的,也可能会发生栈内存溢出错误,因为递归的太深了。