我也想知道static的调用,为啥直接用类名就可以调用,我们知道static修饰的变量值是存放在数据段中,而我们要访问某一变量,首先要找到变量所依附的载体,换句话说就是要找到一个已存在的路径或者地址,而我们直接通过类名来访问的,而类应该是没有专门的一个地址吧,但是如何实现访问的呢

解决方案 »

  1.   

    这个你看字节码去吧。http://java.sun.com/docs/books/jvms/second_edition/html/VMSpecTOC.doc.html
      

  2.   

    static 声名的 属性 所有的 对象 使用的就是 同一个 属性
    所以可以用对象 和类名 调用 是为了方便才加上 类名调用的
      

  3.   

    JAVA中 只有类和对象 有时后类也可以看做为对象 叫对象类,所以你直接用 类名去调用STATIC 的变量是可以的,就如同  对象调用属性一样.呵呵 这是个人理解.
      

  4.   

    static 属性,在类加载的时候已经分配的地址空间
    而非static属性,在获得类的实例,也就是new的时候才分配地址空间所以我们可以直接使用,而无需new一个对象出来。
      

  5.   

    static定义的属性或者方法属于类属性和类方法,在类加载时,这些属性和方法也就同时加载了,可以用类名直接调用.
      

  6.   

    你们都没说到点子上啊,请看清题,
    我知道static是首先加载,但是加载了能说明啥子呢,只能说明为其分配了内存空间,但是我用时,我是如何知道这个空间的,在java中,我们访问任何数据都必需找到其地址,但是我们是如何通过类来找到的呢,一个类与satic的数据有啥关系呢,换个方面来说,如果是因为satict先加载的话,哪好,我等程序都加载以后,我用普通的类来调用其常规属性,也能访问了,但是结果确不是这样,
      

  7.   

    这个问题涉及到类的加载机制 ClassLoader 具体什么ClassLoader 
    我记得不是非常清楚了 明天给予你详细的解答
    今天给你举个小例子希望能帮助你理解
    众所周知 java.lang这个包是不需要import就可以直接用的
    里面有一个著名的System.out.println就是一个静态的方法
    在你调用这个方法之前 java已经把 java.lang 加载到内存中去了 所以这个类你可以直接使用
    其他的静态方法只是用不同的装载器装在罢了 原理是一样的 
    内存中已经有一份对象存在了 而你用类名.方法名就可以调用了
    建议你看一下反射机制
    不一定非要用new创建一个类的实例Class.forName()也可以创建一个类的实例
    等我补充一下知识明天再给你详细解答这个问题哈 希望对你能有所帮助
      

  8.   

    我来说一下巴 就算没有明白也要给分啊呵呵!
    在Java中你要使用一个类的或者类的变量首先这个类要被Java虚拟机加载,当Java虚拟机把类的.class文件中的二进制数据读入内存中,把它存放在运行时数据区的方法区内,然后在堆创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.静态变量和静态方法是在类加载的时候就进行初始化了并且只初始化一次,所以可以用类类型的名字加上点来访问对象的静态变量.另外静态变量是放在方法区的而实例变量是放在堆区的(既它所属的实例对象所在堆的区间内).另外这个时候类只是被加载并没有被初始化,假如你要new个对象的话这个时候才会进行初始化.如果楼主还不明白的话建议你区看看孙卫琴的Java面向对象编程那本书有专门讲类的加载的那章节的,看完就会明白的不过别忘了给分啊