码迷,mamicode.com
首页 > 其他好文 > 详细

对象与内存

时间:2018-05-19 20:41:47      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:构造函数   创建   空间   外部   存储   静态成员   阅读   局部内部类   person   

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,最后才执行构造函数内的代码。

 

以上文章为本人阅读疯狂java讲义后的笔记,详细请观看疯狂java讲义这本书,感谢特别此书作者李刚先生!

对象与内存

标签:构造函数   创建   空间   外部   存储   静态成员   阅读   局部内部类   person   

原文地址:https://www.cnblogs.com/zhlblogs/p/9061443.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!