黑马程序员技术交流社区

标题: static 方法与非static 方法的不同点有哪些? [打印本页]

作者: 柴亚飞    时间: 2011-11-2 16:05
标题: static 方法与非static 方法的不同点有哪些?
我主要是想问,static 方法是不是和static属性一样,在相同类的不同对象中只占一份内存空间?
作者: 白倩    时间: 2011-11-2 16:28
static属性在内存中就只有一个
作者: 柴亚飞    时间: 2011-11-2 16:29
那static方法呢?static方法是不是也只有一份?
作者: 白倩    时间: 2011-11-2 16:31
是这样的,static修饰的方法或是变量是独享一块内存空间
作者: 柴亚飞    时间: 2011-11-2 16:32
static方法和非static的方法的区别难道仅仅就是一个可以直接用类 名.方法名直接调用,一个必须通过对象名.方法名来调用?

前辈们都来指教一下啊
作者: 柴亚飞    时间: 2011-11-2 16:34
哦,知道了。谢谢
作者: byronsong    时间: 2011-11-4 13:28
本帖最后由 byronsong 于 2011-11-4 13:29 编辑

static 的方法和属性都是在内存中的方法区存在,不在堆中,也不在栈中,随着类的加载就已经在内存中存在了,并且只有一个,不需要new对象来使用,直接通过类名来调用。一般公有的属性和方法都设置成静态的 方便使用。
作者: 张晨    时间: 2011-11-4 13:39
还有static数据只初始化一次,所以当一个循环中用static数据时,即使读到如 static int a =1 这个语句 也不会在给a赋1了,而是继续使用在内存中a的数值
作者: 坚强    时间: 2011-11-4 14:36
static 是在堆内存中的 在建立对象的时候就会在堆内存中开辟空间
作者: 庄承荣    时间: 2011-11-4 16:08
static方法是独立于对象而存在的,也就是类加载器加载类以后你就可以直接调用(可以通过类名来进行),因此,static属性在内存中就只有一个。
静态方法只是依附在类存在,而不是依赖对象而存在,所以在使用这些方法的时候,你不用new对象就可以使用,还有一个很大的特点是全局唯一,也就是你再任何地方的程序对它的引用都是访问同一个方法或是对象,如果你用static的对象,那么所有程序访问的都是一个对象,任何地方做了改变都会影响该对象,而如果是new出来的,那几完全不一样了。

具体是否要采用static方法,我觉得应该根据对象设计,如果是和对象没有直接联系或是交互,或是需要全局唯一,都可以采用static方法,对方法和对属性都是一样的。

static方法访问也是比较快的,比对象的方法要快,不用生成对象,就可以调用,但千万记住了,这不意味着所有的方法都采用static。需要根据实际情况来使用。
作者: 坚强    时间: 2011-11-5 21:19
static修饰的成员(变量和函数)都在堆内存中占一份空间,随着对象的加载而加载
作者: 肖瑞军    时间: 2011-11-5 22:37
本帖最后由 肖瑞军 于 2011-11-5 22:41 编辑

      static 方法在该方法所属类型第一次被使用的时候加载、在该类型所在应用程序域卸载的时候卸载、而实例方法(非静态方法),是在第一次该方法第一次调用的时候会加载、然后被缓存起来。但是中间如果有垃圾收集的话, 就会被收集,那下次再调用该方法时,又得重新加载该方法。也就是说,实例方法有可能加载多次。  总的来说,static 方法只用加载一次,但一直会占用内存。多了些资源消耗;而实例方法需要加载多次,但不会一直占用内存。少些资源消耗。一般来说, 在程序里面,一些使用频率高的方法就用static 方法、使用频率低的则用实例方法。

作者: 张翼    时间: 2011-11-7 19:16
static修饰的方法是类级别,当API中标明为static时候,表示调用该方法除了对象,还可以用类;
还有类方法不可以被重写;





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2