定义一个java类,在内存中是栈内存指向堆内存的一个地址。那个这个新new出来的对象是在堆内存中。  如果这个类里面有static修饰的变量,那么这个变量是放在数据区的,这里怎么理解,是堆内存中的对象指向数据区的一个地址吗?

解决方案 »

  1.   

    class Student{
    static String name = "st";

    public static void main(String[] args){
    Student s1 = new Student ();
    Student s2 = new Student ();
    System.out.println(s2.name == s1.name);
    }
    }
    应该不是在new时才分配,应该是在编译时,name变量就分配好了地址空间,而new出来的Student对象在运行时期才分配地址空间大小,
    如果运行System.out.println(s2.name == s1.name); 会返回true 说明name在内存中只有一份。
    至于s1 和s2 是怎么关联到一个静态数据并且是在编译时就把name的地址在student的字节码中保存起来,这个就是编译器的作用了。
      

  2.   

    声明为static的变量实质上就是全局变量。当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共用同一个static变量,例如:声明一个static的变量count作为new一个类实例的计数。声明为static的方法有以下几条限制:1、它们仅能调用其他的static 方法。2、它们只能访问static数据。3、它们不能以任何方式引用this 或super。
      

  3.   

    应该是放在方法区吧?方法区存放类信息、常量、代码等数据。方法区俗称永久代。static变量应该在类第一次加载的时候就加载了.肯定是有指针的,不然怎么用呢?
      

  4.   

    用static声明的变量,不保存在这个类中。
      

  5.   

    呵呵,今天刚学了static。弱弱的解释下吧
    static 修饰的成员变量,是所有对象的共享内容,在JVM加载该类时,就被加载进了内存,存放在方法区的静态区,它是优先于对象存在的,不需要new 出对象,就可以被类直接调用。调用方法:类名.变量名 。
      

  6.   

    你记住:凡是new出来的都是在堆中
      

  7.   

    编译期就放在内存中?内存是指什么?如果我关机了,内存不都释放了吗?难道一开机java就会给你加到内存中去?
      

  8.   

    java是什么时候用到这个类才帮你放到内存里面去的。与编译没有任何关系。
      

  9.   

    我觉得:对象是类的实例,类是个壳,象static声明的变量在代码区,而对象如People p = new People();p是个引用变量,它不是起指引作用么,它反正有办法找个那个static变量,而类自身也可以找到,这就像p可以找到堆内存中的其他成员差不多吧。
      

  10.   

    我觉得:对象是类的实例,类是个壳,象static声明的变量在代码区,而对象如People p = new People();p是个引用变量,它不是起指引作用么,它反正有办法找个那个static变量,而类自身也可以找到,这就像p可以找到堆内存中的其他成员差不多吧。
      

  11.   

    你记住:凡是new出来的都是在堆中
      

  12.   

    推荐大家看一下这本书。http://book.douban.com/subject/6522893/
      

  13.   

    首先要区别变量和对象
    Object o = new Object();
    那么o是变量,new Object()是对象,变量o的内存中保存new Object对象的地址
    new出来的对象在堆中,所以new Object()对象存在于堆中,这个没有问题的
    LZ的疑惑是o变量本身存在哪里,对吧如果o是局部变量,那么o存在于定义该变量的方法的栈内存中,
    比如 void a() {Object o = new Object();} 
    那么o存在于a方法栈内存中,在a方法被调用的时候分配内存的如果o是非static成员变量,那么o存在于它所依存的对象的数据区中,即o存在它的对象的内存中(o作为该对象的属性而存在)
    比如
    class A {
        Object o = new Object();
    }
    那么o存在于A对象的数据区中,在A对象被生成的时候分配内存的如果o是static变量,那么o存在于方法区(也叫静态区)
    比如
    class A {
        static Object o = new Object();
    }
    那么o存在于方法区,在类加载的时候被分配内存的
      

  14.   

    我觉得是根据应用方式和本身特性才将内存分区的,目的是提高效率和方便管理等栈的特点是容量小,速度快,可能昂贵,就适合放置静态,全局等小且需要经常访问但不怎么变化的数据
    堆的特点是容量大,速度慢,可能便宜,就适合放置动态分配的数据,因为动态分配的数据不确定且容量大,数量多,比如对象,生存期相对较短,就以无序状态存储于堆中。像方法区之类是堆的一部分,我觉得更多是因为业务逻辑上便于分类管理的需要而应运而生的详细可看:
    http://java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html