JVM
java虚拟机分为五个区域
静态的资源在方法区加载类的时候加载
非静态的 在new对象的时候加载
栈内存: 用来运行java中的方法
栈中数据的特点 : 因为是方法,所以方法中的变量不赋值不能使用
用来运行java中的方法, 保存堆内存new出来的变量数据
堆内存 :保存new 出来的各种对象
对象所属于类的所有成员变量 随着对象的出现在堆内存中初始化加载
堆中数据的特点 : 不赋值可以使用, 因为有默认初始化值
整数: 0
小数: 0.0
布尔: false
字符串: null
char : /u0000 (在程序中就是一个空格)
方法区: 加载和运行class文件的(字节码文件)
String类对象字符串 属于常量.一旦创建不能更改 … 存在 方法区的字符串常量池中;
static修饰的成员变量,在类加载的时候存放在 方法区的静态区中 会直接在静态区域开辟一块空间
本地方法: JVM虚拟机和系统交互的空间
程序计数器: cpu使用的内存空间
数组的内存图:
方法运行 进栈, 走到new 数组 在堆中开辟空间 然后赋值给arr
对象创建过程 :
1.new 堆中开辟空间,分配唯一的内存地址
2.加载成员变量 ,给所有成员变量默认赋值
3.赋值完成后, 调用与传递参数一致的构造方法
4.执行构造方法
5.构造方法完成,表示对象创建完成
字符串的内存图 :
字符串一旦创建不能更改(其实就是指向的地址改变),属于常量,可以共享
字符串属于常量,存在方法区的常量池中(字符串常量池) .
堆中的对象没被引用会变成垃圾 被GC回收,但是字符串没被引用的常量却一直存在.
String s1=“abc”;
String s2=“abc”;
s1==s2 结果是 true; 因为字符串是常量可以共享, 所以s1s2指向的同一个地址
String s =“abc” s直接引用方法区常量池中的字符串地址
String s = new String() 在堆人中开辟空间,然后引用方取区常量池中的字符串
类加载的过程:
this关键字 :
作用是用来记录当前方法是被哪个对象调用的,哪个对象调用方法,this就记录哪个对象.
可以解决:成员变量和局部变量重名的方法
Static关键字:
它是一个修饰符,可以修饰类中的成员变量,成员方法。
特点: 被static修饰的成员变量我们称为 : 类变量(静态变量)修饰的方法称为 : 类方法(静态方法)
被static修饰的内容是所有对象共享的,所有和对象无关,只和当前的类相关,因此被static修饰的成员,访问的方式是使用 类名.成员(变量,方法);
Static修饰成员变量:
-
- 当成员变量被所有的对象的共享时,可以使用static关键字进行修饰。被static修饰的成员变量,是在类加载的时候,直接开辟空间,保存在方法区的静态区中。 当成员变量被静态修饰之后,在访问时,不需要通过对象访问,可以通过类名直接方法。
-
- 因为静态的成员变量是被所有对象共享的,所以只要有1个对象改变了其值,另外的对象在去访问,都是被改变之后的值。
-
只要成员变量加上static关键字 他就被共享 他也就存在方法区中了
-
静态方法中 不能存在this关键字. 因为this表示当前调用的对象,静态的在类加载的时候就存在方法区了
Static修饰成员方法:
-
- 当类中定义的成员方法中,没有访问到成员变量时,创建对象访问方法,对象是多余的。如果能够在不创建对象的前提下就能调用没有访问到成员变量的方法,可以节省资源。
-
- 使用static关键字对方法进行修饰,被static修饰的方法和对象无关,只和当前类相关。被static修饰的方法可以被所有对象共享。 使用类名.成员方法即可。