Java中内存结构分析:
1.栈:一般存放基本数据类型
2.堆:存放对象
3.方法区:常量池(常量,比如字符串),类加载信息(属性信息、方法信息)
创建对象流程的简单分析:
Person person = new Person();//创建对象
person.name="jack";
person.age=19;
(以下分析参考下面的图片)
1.先加载Person类信息(属性和方法信息,只会加载一次,在方法区中加载);
2.在堆中分配空间(new Person()创建了对象就会在堆中分配空间,如下图堆中的橙色空间),进行默认初始化(按规则来,一开始String类型的name初始化为null,int类型的age初始化为0);
3.把地址赋给person,person就指向对象(上一步完成后,会将堆中对象的内存地址赋给person,因此person只是引用了对象,不能说person就是对象);
4.进行指定初始化,比如person.name=“jack”;person.age=19
方法调用的内存机制分析:
1.当程序执行到方法时,就会开辟一个独立的空间(栈空间);
2.当方法执行完毕,或者执行到return语句就会返回;
3.返回到调用方法的地方,(如果方法还没执行完,返回后,则继续执行方法后面的代码),原方法的独立空间(栈空间)销毁释放;
4.当main方法(栈)执行完毕,整个程序退出
成员方法传参机制:
1.基本数据类型,传递的是值(值拷贝),形参的任何改变不影响实参。
以下方代码为例做分析:
import java.util.Scanner;
public class Main {
//编写一个 main 方法
public static void main(String[] args) {
int a = 10;
int b = 20;
//创建 AA 对象 名字 obj
AA obj = new AA();
obj.swap(a, b); //调用 swap
System.out.println("main 方法 a=" + a + " b=" + b);
}
}
class AA {
public void swap(int a,int b){
System.out.println("\na 和 b 交换前的值\na=" + a + "\tb=" + b);
//完成了 a 和 b 的交换
int tmp = a;
a = b;
b = tmp;
System.out.println("\na 和 b 交换后的值\na=" + a + "\tb=" + b);
}
}
所以最后输出结果为:
2. 引用类型传递的是地址(传递也是值,但是值是地址),可以通过形参影响实参
(1)以下方代码为例做分析:
public class Main {
//编写一个 main 方法
public static void main(String[] args) {
//测试
B b = new B();
int[] arr = {1, 2, 3};
b.test100(arr);//调用方法
System.out.println(" main 的 arr 数组 ");
//遍历数组
for(int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + "\t");
}
System.out.println();
}
}
class B {
public void test100(int[] arr) {
arr[0] = 200;//修改元素
//遍历数组
System.out.println(" test100 的 arr 数组 ");
for(int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + "\t");
}
System.out.println();
}
}
所以最后输出的结果为:
(2)以下方代码为例做分析:
import java.util.Scanner;
public class Main {
//编写一个 main 方法
public static void main(String[] args) {
B b = new B();
Person p = new Person();
p.name = "jack";
p.age = 10;
b.test200(p);
System.out.println("main 的 p.age=" + p.age);
}
}
class Person {
String name;
int age;
}
class B {
public void test200(Person p) {
//p.age = 10000; //修改对象属性
//思考
p = new Person();
p.name = "tom";
p.age = 99;
}
}
所以运行结果如下: