黑马程序员技术交流社区

标题: 关于类加载的问题 [打印本页]

作者: 136616244    时间: 2014-4-25 09:52
标题: 关于类加载的问题
类加载的时候,静态方法和非静态方法都会加载到方法区中,静态方法可以通过类名直接调用,非静态方法通过实例化该类对象,在堆中引用一个地址值指向方法区中的方法。还是加载类的时候方法区中值加载静态方法?
既然静态和非静态都加载进方法区了,那么就是都加载进内存了,为什么不都用静态修饰,方便调用呢?
不知道哪里理解错了!
作者: 世界公民    时间: 2014-4-25 10:11
本帖最后由 世界公民 于 2014-4-25 10:14 编辑

静态方法只加载一次,普通方法,创建一个实例就加载一次。静态方法是类的方法,普通方法是对象的方法。
普通方法因为实例对象的不同而不同,但是静态方法都是一样的,是所有对象共用的。如果类中的方法都是静态的,那么就没有必要创建类的实例了,因为创建的实例都是完全相同的。正是因为类有普通方法,类创建的实例才具有多样性。

作者: 悠然丶    时间: 2014-4-25 10:41
静态成员是随着类的加载而加载的,当成员被静态修饰后就多了一种调用方式.类名.调用.
被Static修饰后的成员会在方法区中,你要记住被静态修饰的成员先于对象存在,就是说你没有创建对象
静态成员就已经随着类的加载存在了,而且会被所有的对象共享! 静态的生命周期也是最常的!

静态的注意事项:
静态方法只能访问静态成员
非静态方法,既可以访问静态页可以访问非静态

静态方法中不可以定义 this  super关键字

什么时候定义静态??这个要理解
先说静态变量,当对象中出现共享数据时,可以定义成静态的,被所有对象共享,节省空间
再说方法:  当方法内部没有访问到非静态数据,也就是对象的特有属性时,这个方法可以定义成静态的!

把静态弄懂了,类加载也就不是问题了...


作者: 宋美成    时间: 2014-4-25 11:04
本帖最后由 宋美成 于 2014-4-25 11:06 编辑

只要搞清楚了静态与非静态之间的区别就好
1、静态函数是随着类的加载而存在的,随着类的消失而消失,他属于整个类,是类共享的
    而非静态函数是随着对象的创建而存在的,随着对象的收回而被释放
2、调用方法上,成员函数的调用只能被对象调用
     静态方法可以直接被类名调用
3、静态方法与非静态方法虽然在加载时都加载到方法区,但是是有区别的,静态方法在方法区的静态部分    非静态方法是在方法区的非静态部分,注意区别!只不过要调用到非静态方法时需要先实例化一个对象,对象才能调用非静态方法

作者: zzkang0206    时间: 2014-4-25 16:01
静态是公共的,你能把公交车开回家吗!
作者: igi9009    时间: 2014-4-25 17:20
你问为什么不都用静态修饰,方便调用呢?
原因是考虑到占用内存的问题。
静态方法和静态成员变量是在该类被加载的时候就会被加载进内存,随着类的释放而释放,所有的类都可以访问该方法和该成员变量,生命周期特别长。
而非静态方法只有通过实例化对象才能调用该方法,而且只有该对象能调用该方法,随着对象的建立而建立,随着对象的释放而释放。生命周期短很多。
如果你把所有方法都用静态了,那程序要是大一点的话,那内存不是就挤爆了。




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