zoukankan      html  css  js  c++  java
  • 对象与内存(一)

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

     

    注意以下两段代码的运行结果:

  • 相关阅读:
    索引,约束
    C# Dictionary 的几种遍历方法
    唯一性约束和唯一性索引的区别
    JS中offsetTop、clientTop、scrollTop、offsetTop各属性介绍
    Dictionary学习笔记嵌套Dictionary的遍历与排序(按Key值)(二)
    Dictionary学习笔记Dictionary定义与输出(一)
    集体智慧编程笔记搜索和排序
    emacs键盘映射
    集体智慧编程笔记推荐系统
    使用SRILM训练大的语言模型
  • 原文地址:https://www.cnblogs.com/zhlblogs/p/9061443.html
Copyright © 2011-2022 走看看