一、JVM的内存划分
内存是计算机中的重要原件,临时存储区域,作用是运行程序。我们编写的程序是存放在硬盘中的,在硬盘中的程 序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存。Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。
为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式,共分为5部分:
栈:存储的都是方法中的局部变量,方法运行一定要在栈中运行。
堆:存储对象或者数组,new来创建的,都存储在堆内存。
方法区:存储可以运行的class文件,包含方法的信息。
寄存器:给CPU使用,和我们开发无关。
本地方法栈:JVM在使用操作系统功能的时候使用,和我们开发无关。
程序执行过程示例图:
二、方法中参数的传递实质
方法:就是将一个功能抽取出来,把代码单独定义在一个大括号内,形成一个单独的功能。当我们需要这个功能的时候,就可以去调用。这样即实现了代码的复用性,也解决了代码冗余的现象。
定义格式:
修饰符 返回值类型 方法名(参数列表){
代码...
return 结果; }
定义格式解释:
修饰符: 目前固定写法 public static 。
返回值类型: 目前固定写法 void ,其他返回值类型在后面的课程讲解。
方法名:为我们定义的方法起名,满足标识符的规范,用来调用方法。
参数列表: 空车,有参两种形式。
return:方法结束。因为返回值类型是void,方法大括号内的return可以不写。
举例:
public static void methodName() {
System.out.println(“这是一个方法”);
}
方法重载:指在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表不同即可,与修饰符和返回值类型无关。参数列表:个数不同,数据类型不同,顺序不同。
重载方法调用:JVM通过方法的参数列表,调用不同的方法。
方法的参数为基本类型时,传递的是数据值. 方法的参数为引用类型时,传递的是地址值。
参数为引用数据类型是值传递很好理解,可见下方实例图所示。
public static void main(String[] args) {
int[] arr = getArray();
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
public static int[] getArray() {
int[] arr = { 1, 3, 5, 7, 9 };
//返回数组的地址,返回到调用者
return arr;
}
重点说一下参数为基本数据类型的值。
值传递:是指在调用函数时,将实际参数复制一份传递给函数,这样在函数中修改参数时,不会影响到实际参数。其实,就是在说值传递时,只会改变形参,不会改变实参。
这里,需要特别强调的是,千万不要以为传递的参数是值就是值传递,传递的是引用就是引用传递。也不要以为传递的参数是基本数据类型就是值传递,传递的是对象就是引用传递。 这是大错特错的。以前的我,一直都是这样认为的,现在想来真是太天真了。判断是值传递还是引用传递的标准,和传递参数的类型是没有一毛钱关系的。
以下面试题为例:
package com.cp.demo;
public class Method_Demo1 {
public static void main(String[] args) {
int a = 1;
int b = 2;
System.out.println(a); //1
System.out.println(b); //2
change(a, b);
System.out.println(a); //1
System.out.println(b); //2
}
public static void change(int a, int b) {
a = a + b;
b = b + a;
System.out.println(a);
System.out.println(b);
}
}
结果为:
1
2
3
5
1
2