9.方法
9.1什么是方法?
功能代码只需要输入一遍
要使用这个功能,只需要给这个功能传递具体的数据
这个功能完成之后返回一个最终结果
这样的代码就可以重复使用,提高代码复用性
方法定义在类体当中,在一个类体当中可以定义多个方法,方法编写的位置没有先后顺序,可以随意。
方法体由java语句构成,方法体当中的代码遵守自上而下的顺序一次执行。
方法体当中不能再定义方法。
方法就是一个代码片段,并且这段代码片段可以完成某个指定的功能,并且可以被重复的使用。
9.2方法的定义
9.2.1有具体返回值类型的方法的定义
[修饰符列表] 返回值类型 方法名(形式参数列表){
方法体;
}
对以上的语法结构进行解释说明:
修饰符列表:
public: 访问权限足够大,公共的
static: 静态修饰符(面向对象中讲)
返回值类型:
就是数据类型(目前使用的基本数据类型…)
方法名:
见名知意 (小驼峰命名法)
形参列表:
形参中起决定性作用的是形参的数据类型,形参的名字就是局部变量的名字
方法在调用的时候,实际给这个方法传递的真实数据被称为:实参
实参和形参列表必须数量相同,类型对应相同
方法体:
方法体必须由大括号括起来,方法体中你的代码有顺序,遵循自上而下的顺序依次执行。
并且方法由java语句构成,每一个java语句以“;”结尾。
9.2.2有具体返回值类型的方法的定义:
[修饰符列表] void 方法名(形式参数列表){
方法体;
}
9.2.3定义一个方法需要明确的两点:
1)明确返回值类型:没有具体返回值类型
2)明确参数类型以及参数个数
9.3方法的调用
类名.方法名(实参列表);//这是一条java语句,表示调用某个类的某个方法,传递这样的实参
方法只有在调用的时候才会执行,只定义不调用是不会执行的。
方法的修饰符列表当中有static
方法调用的时候实参和形参要求能够进行相应的自动个数对应相同,数据类型对应相同
类型不同的时候要求能够进行相应的自动类型转换
调用本类中static修饰的方法时,类名可以省略(只有这种情况可以不加)
9.4方法在执行过程当中,JVM中内存的分配和变化
9.4.1.内存的分配
方法只定义不调用,是不会执行的,并且在JVM中也不会给该方法分配“运行所属”的内存空间。只有在调用这个方法的时候,才会动态的给这个方法分配所属的内存空间。
9.4.2.内存的分配
在JVM内存划分上有这样三块主要的内存空间:
方法区内存
堆内存
栈内存
9.4.3关于栈数据结构:
数据结构反映的是数据的存储形态
常见的数据结构:
数组、队列、栈、链表、二叉树、哈希表…
概念:
stack,是一种数据结构
栈帧永远指向栈顶元素
栈顶元素处于活跃状态,其他元素静止
术语:
压栈/入栈/push
弹栈/出栈/pop
特点:
先进后出
后进先出
9.4.4方法执行的时候代码片段存在哪里?方法执行的时候执行过程的内存在哪里分配?
方法代码片段属于.class的一部分,字节码文件在类加载的时候,将其放在方法区中。所以JVM中的三块主要的内存空间中方法区内存最先有数据。存放了代码片段。
代码片段虽然在方法区内存当中只有一份,但是可以被重复调用。每一次调用这个方法的时候,需要给该方法分配单独的活动场所,在栈内存中分配。【栈内存中分配方法运行的所属内存空间】
方法在调用的瞬间,会给该方法分配的内存空间,会在栈中发生压栈(给方法分配内存)动作,方法执行结束之后,给该方法分配的内存空间全部释放,此时发生弹栈(释放该方法的内存空间)动作。
局部变量在方法体中声明,局部变量运行阶段内存在栈中分配。
9.5方法的重载
没有使用重载时:
package 重载;
public class 重载 {
public static void main(String[] args) {
int a = sumInt(1,2);
System.out.println(a);
double b = sumDouble(1.0,2.0);
System.out.println(b);
long c = sumLong(1L,2L);
System.out.println(c);
}
//定义一个方法,计算int类型的求和
public static int sumInt(int a, int b){
return a+b;
}
//定义一个方法,计算double类型的求和
public static double sumDouble(double a, double b){
return a+b;
}
//定义一个方法,计算long类型的求和
public static long sumLong(long a, long b){
return a+b;
}
}
以上内容方法虽然功能不同,但是功能是相似的,都是求和。在以下程序当中功能相似的方法,分别起了三个不同步名字,对程序员来说,调用方法的时候不方便,程序员需要记忆更多的方法,才能完成调用。【不方便且不美观】
重载:虽然功能不同,但是“功能相似”时,可以让程序员使用这些方法的时候就像在使用同一种方法一样,这样程序员以后编写代码比较方便,也不需要记忆更多的方法名,代码也会很美观。
使用重载后:
重载2:
public class 重载2 {
public static void main(String[] args) {
a.b(true);
a.b(2.0);
a.b(null);
}
}
class a{
public static void b(byte c){
System.out.println(c);
}
public static void b(short c){
System.out.println(c);
}
public static void b(char c){
System.out.println(c);
}
public static void b(boolean c){
System.out.println(c);
}
public static void b(long c){
System.out.println(c);
}
public static void b(double c){
System.out.println(c);
}
public static void b(String c){
System.out.println(c);
}
public static void b(int c){
System.out.println(c);
}
}
**
to be continued…
**