有3个问题,都是基于static关键字的用法的问题1:为什么用static修饰的变量是所有对象共享的,它在内存里面是如何存放的,比如说定义个类如下:
public class stu{
  private int name
  private static int share
}
现在我new 2个对象,一个“张三”,一个“李四”,请问这2个对象在内存里面是如何分配空间的,对于share这个属性,它们2个对象如何共享?问题2:为什么用static修饰的方法可以使用“类.方法”直接调用,它的本质是什么,关于方法的本质是什么,方法再内存里面是怎么一回事?问题3:用static修饰的类有什么特性,本质是什么?为什么只能new一次(new多次好像都是同一个对象),本质是什么?那位研究的比较深,希望能给我解释一下,这些东西困扰我好多年了,不甚感激!!!!!

解决方案 »

  1.   

    http://www.zxbc.cn/html/javajc/2507594496006.html
      

  2.   

    1.静态方法和静态变量是属于某一个类,而不属于类的对象。
    2.静态方法和静态变量的引用直接通过类名引用。
    原因:静态修饰的方法或变量是在类声明的时候就已经在内存中分配了空间的,换句话说,不需要new这个类,其静态变量已经存在在内存中了。
    现在我new 2个对象,一个“张三”,一个“李四”,请问这2个对象在内存里面是共享一个空间,就是赋值为“张三”的时候share就是“张三”,当赋值为“李四”的时候,就又变成“张四”了,这个可以用程序来验证
    public class Main {
      static String name;
      Main(String name)
        this.name = name;
      }
      public static void main(String[] args) {
        Main main1 = new Main("张三");
        Main main2 = new Main("李四");
        System.out.println(main1.name); //print 李四
        System.out.println(main2.name); //print 李四
      }
    }
    什么用static修饰的方法可以使用“类.方法”直接调用:就是因为类声明的时候就已经在内存中分配了空间,可以直接调用了。你的三个问题其实都是一个问题就是类声明的时候就已经在内存中分配了空间,所以才有其独特的用法
      

  3.   

    打个比方,就像家里的厕所(STATIC)公用的,只有一个!
      

  4.   

    楼上的错解,static修饰的是放在栈中的,一般对象放在堆中的。
    此外,栈还用来存放一些基本类型的变量和数组及对象的引用变量等。
    而普通变量跟对象一样,在堆中动态分配内存。
      

  5.   

    public class stu{
      private int name
      private static int share
    }
    现在我new 2个对象,一个“张三”,一个“李四”,请问这2个对象在内存里面是如何分配空间的,对于share这个属性,它们2个对象如何共享?
    -------------------------------------------------------------------------------------------------------------------------------
    “张三”和“李四" 对象中各有一份 name , 而share存放在stu.class对象中.“张三”和“李四"都是stu.class对象的实例对象,所以它们可以引用share.问题2:为什么用static修饰的方法可以使用“类.方法”直接调用,它的本质是什么,关于方法的本质是什么,方法再内存里面是怎么一回事?
    -------------------------------------------------------------------------------------------------------------------------------
    你理解什么是类对象,什么是实例对象吗? 类对象在一个classloader中只能有一个,可以把它理解成实例对象的模板,而实例对象的数量在classloader中是没有限制的。
    关于方法的本质是什么,我也不敢妄下定论,因为你要知道线程是运行在栈中的,在调用方法的时候是需要压栈的(本地方法除外),这就要求将方法中的局部变量都COPY一份到栈中。如果是没有加锁的全局变量也同样会有一份拷贝,所以有可能被多线程处理的对象要考虑同步问题。问题3:用static修饰的类有什么特性,本质是什么?为什么只能new一次(new多次好像都是同一个对象),本质是什么? 
    ---------------------------------------------------------------------------------------------------------------------
    这个把问题1和2理解了,也就自然理解问题3。
      

  6.   


    推荐一本书《深入java虚拟机》