对象在内存中的布局
类和对象的内存分配机制
java内存的结构分析
java创建对象的流程简单分析
Person p = new Person();
p.name = "jack";
p.age = 10;
1、先加载Person类信息(属性及方法信息在方法区,只会加载一次)
4、进行指令初始化,比如 p.name = "jack"; p.age = 10;
方法调用机制
一旦return结束之后 getSum这个栈就会被释放掉
小结:
1、当程序执行到方法时,就会开辟一个独立的空间(栈空间)
2、当方法执行完毕,或者执行到return语句后,就会返回到调用方法的地方
3、返回后,继续执行方法后面的代码
4、当main方法执行完毕,整个程序会退出
访问修饰符
方法传参机制-基本数据类型
结论:对于基本数据类型,传递的是值(值拷贝),形参的任何改变都不能影响到实参!!!
方法传参机制-引用数据类型
结论:引用类型传递的是地址(传递的也是值,地址值),可以通过形参影响实参
作用域
1、全局变量(属性)可以不赋值,直接使用,因为有默认值,但是,局部变量必须手动赋值后,才可以使用,因为没有默认值
2、属性和局部变量可以重名,访问时遵循就近原则
3、属性的生命周期较长,伴随着对象的创建而创建,伴随着对象的销毁而销毁。局部变量,声明周期较短,伴随着它的代码块的执行而创建,伴随着代码块的结束而死亡,即在一次方法调用过程中。
package com.migu.poms.pugc.microdrama.controller;
public class Test4 {
public static void main(String[] args) {
Person p1 = new Person();
/*
属性的生命周期较长,伴随着对象的创建而创建,伴随着对象的销毁而销毁。
局部变量,声明周期较短,伴随着它的代码块的执行而创建,伴随着代码块的结束而死亡,即在一次方法调用过程中
*/
p1.say(); // 当执行方法时,say方法的局部变量name就会被创建,当say方法执行完毕后,name局部变量就会被销毁,但是属性name(全局变量)还可以使用
}
}
class Person {
String name = "jack";
public void say() {
String name = "King";
System.out.println("say() name = " + name);
}
}
4、作用域范围不同
全局变量/属性:可以被本类或者其他类使用
局部变量:只能在本类中对应的方法使用
5、修饰符不一样
全局变量/属性 可以加修饰符
局部变量不能加修饰符
构造器
构造器是完成对象的初始化,并不是创建对象
对象创建流程分析-进阶
1、先加载Person类信息,只会加载一次
2、在堆中分配空间(地址0x1112)
3、完成属性对象初始化
3.1、默认初始化 age = 0 name = null
3.2、显式初始化 age = 90 name = null
3.3、构造器初始化 age = 20 name = "小倩"
4、把对象从堆中的地址返回给 p(p是对象名,也可以理解成对象的引用)