A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 136616244 中级黑马   /  2014-4-25 09:52  /  1609 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

类加载的时候,静态方法和非静态方法都会加载到方法区中,静态方法可以通过类名直接调用,非静态方法通过实例化该类对象,在堆中引用一个地址值指向方法区中的方法。还是加载类的时候方法区中值加载静态方法?
既然静态和非静态都加载进方法区了,那么就是都加载进内存了,为什么不都用静态修饰,方便调用呢?
不知道哪里理解错了!

5 个回复

倒序浏览
本帖最后由 世界公民 于 2014-4-25 10:14 编辑

静态方法只加载一次,普通方法,创建一个实例就加载一次。静态方法是类的方法,普通方法是对象的方法。
普通方法因为实例对象的不同而不同,但是静态方法都是一样的,是所有对象共用的。如果类中的方法都是静态的,那么就没有必要创建类的实例了,因为创建的实例都是完全相同的。正是因为类有普通方法,类创建的实例才具有多样性。
回复 使用道具 举报
静态成员是随着类的加载而加载的,当成员被静态修饰后就多了一种调用方式.类名.调用.
被Static修饰后的成员会在方法区中,你要记住被静态修饰的成员先于对象存在,就是说你没有创建对象
静态成员就已经随着类的加载存在了,而且会被所有的对象共享! 静态的生命周期也是最常的!

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

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

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

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

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 宋美成 于 2014-4-25 11:06 编辑

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

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
静态是公共的,你能把公交车开回家吗!
回复 使用道具 举报
你问为什么不都用静态修饰,方便调用呢?
原因是考虑到占用内存的问题。
静态方法和静态成员变量是在该类被加载的时候就会被加载进内存,随着类的释放而释放,所有的类都可以访问该方法和该成员变量,生命周期特别长。
而非静态方法只有通过实例化对象才能调用该方法,而且只有该对象能调用该方法,随着对象的建立而建立,随着对象的释放而释放。生命周期短很多。
如果你把所有方法都用静态了,那程序要是大一点的话,那内存不是就挤爆了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马