对象与内存
Posted 永不宕机
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对象与内存相关的知识,希望对你有一定的参考价值。
java内存管理分为两方面:内存的分配与内存的回收。
jvm的垃圾回收机制是由一条后台线程完成的,如果肆无忌惮创建对象,让系统分配内存,则会造成系统可用内存的减少,降低了程序运行的性能,同时也会加重垃圾回收机制的负担,程序运行性能会更低。
java程序的变量大体可分为成员变量和局部变量。局部变量又分为如下三类:1.形参:在方法签名中定义的局部变量,由方法调用者负责为其赋值,随方法的结束而消亡。2.方法体内的局部变量:在方法内定义的局部变量,必须在方法体内对其进行显示初始化。从初始化完成之后开始生效,随方法的结束而消亡。3.代码块内的局部变量:在代码块中定义的局部变量,必须在代码块中对其进行初始化,从初始化完成生效,随代码块结束而消亡。
局部变量被存储在方法的栈内存中。
定义成员变量时,如果用static修饰的变量则称为类变量或静态成员变量,而没有被static修饰的成员变量则称为非静态成员变量或实例变量,static只能修饰类里的成员,不能修饰外部类,局部变量以及局部内部类。
注意:在加载类时,首先会加载静态成员变量,静态成员方法(按代码顺序进行加载),然后才加载非静态变量和方法。如下代码所示:
public class Test{ int a = b + 2; static int b = 10; } //上面Test的代码正确 public class Test1{ static int a = b + 2; static int b = 10; } public class Test2{ int a = b + 2; int b = 10; } //上面Test1和Test2的代码是错误的正确(非法前向引用)
类变量属于类本身,而实例变量则属于该类的实例。在同一个jvm中,每个类只有一个class对象,但可以有多个实例对象。因此,在同一个jvm中,一个类的类变量只需要一块内存空间,而每创建一次实例则需要为该实例变量分配一块内存空间。类变量和实例变量在内存中的存储结构如下:
1 public class Person{ 2 3 public static double money; 4 5 public String name; 6 7 public String sex; 8 9 }
请注意一下代码的执行顺序,根据注意事项可知,在运行java类时,首先会为各个成员变量进行分配空间,然后才按照顺序对其进行初始化。
上图运行流程如下:首先为成员变量分配内存空间,然后运行静态代码(按照顺序),先为name初始化为“java编程”,然后再将其初始化为“我爱java”。接着在调用构造函数时,先运行非静态代码块,为wight初始化为10.0,然后再将wigt的值修改为20.0,最后才执行构造函数内的代码。
注意以下两段代码的运行结果:
以上是关于对象与内存的主要内容,如果未能解决你的问题,请参考以下文章
VSCode自定义代码片段12——JavaScript的Promise对象