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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

我可以理解,静态方法不可以调用非静态变量,但是不不能理解为什么不能调用非静态方法!希望知道的盆友可以给我解释一下,尽量详尽!谢谢!

29 个回复

正序浏览
ss5619498 发表于 2014-7-13 13:11
因为他俩跟本放的不是一个地方
静态方法存储在栈中,
而其他的非静态方法存储在堆中基本如图

静态方法不是在栈内存中吧!应该是在方法区中。  
回复 使用道具 举报
Adjin 中级黑马 2014-7-16 11:31:46
28#
调用方法只有两种方法:类名调用,对象调用
非静态方法只能对象调用,都没有对象,所以只能调用静态方法了
回复 使用道具 举报
LFW 中级黑马 2014-7-15 18:43:46
27#
mytongyong 发表于 2014-7-13 06:00
我在一本书上看到过,对象.方法()来调用静态方法是java的一个缺陷,因为这样语义上不明确吧,静态方法是 ...

但静态方法也是方法啊,特殊的方法一样有普通方法的特性。。我觉得对象.()方法没有不妥吧?
回复 使用道具 举报
LFW 中级黑马 2014-7-15 18:42:39
26#
fantacyleo 发表于 2014-7-13 02:42
和不能调用非静态变量一样的原因:静态方法不与类的对象挂钩,而非静态方法必须由对象调用。每个非静态方法 ...

我也是这样想的
回复 使用道具 举报
静态成员是随着类的加载而加载的,而成员变量或函数是随着对象的加载而加载的,非静态方法需要被对象调用才执行,静态方法优先存在非静态方法,所以静态方法不可以调用非静态方法
回复 使用道具 举报
mytongyong 发表于 2014-7-13 06:00
我在一本书上看到过,对象.方法()来调用静态方法是java的一个缺陷,因为这样语义上不明确吧,静态方法是 ...

C#里只能通过类名调用
回复 使用道具 举报
静态方法是随着类的加载而加载的 而非静态方法是只有创建了对象才可以分配内存 没有对象是不存在的,所以不能调用
回复 使用道具 举报
付江涛 来自手机 金牌黑马 2014-7-14 23:39:26
22#
mytongyong 发表于 2014-7-13 06:00
我在一本书上看到过,对象.方法()来调用静态方法是java的一个缺陷,因为这样语义上不明确吧,静态方法是 ...

李刚的书吧,C#就是把JAVA的坑给填了
回复 使用道具 举报
风决 发表于 2014-7-13 05:41
静态方法与非静态方法,静太方法在对象生成前就已经分配内存---“属于类方法”,而此时非静态方法还没被分 ...

恩,懂了。谢谢:handshake:handshake:handshake
回复 使用道具 举报
215041631 发表于 2014-7-13 14:36
我仔细想了一下,我想应该是正确的:
非静态变量还有个名字叫实例域,故名思义他对象的属性。
如果当一个对 ...

恩,懂了,谢谢:handshake:handshake:handshake
回复 使用道具 举报
看看还是挺有帮助的
回复 使用道具 举报
cat73 发表于 2014-7-13 08:16
静态实际上可以减少资源消耗的

是可以减少资源的消耗,呵呵,我说的仅仅是语义上的不明确,这样没办法区分是所调用的方法是静态方法还是非静态方法。如果要有严谨的定义或者区分的话,最好还是用类名.方法()吧。
回复 使用道具 举报
因为加载先后问题,静态随着类加载而加载,非静态要对象调用才加载,一个先加载的不可能调用一个还未加载的。
回复 使用道具 举报 1 0
因为静态方法随着类的创建而创建,而非静态方法是随着对象的创建而创建,所以,静态方法的生命周期比非静态的要长,不能调用还不存在的方法。
回复 使用道具 举报
javac以后 只是加载了静态内容 而已非静态成员是依附于实例的 所以二者有先后
想调用非静态成员 要实例化出该成员所在的类的实例后 才能调用
回复 使用道具 举报
我仔细想了一下,我想应该是正确的:
非静态变量还有个名字叫实例域,故名思义他对象的属性。
如果当一个对象都还不存在的话,那么他也就不存在。
非静态方法其实跟上面的道理是一样,如果对象还不存在他也就不会在内存中加载进这个方法。如果要加载就浪费空间了所以当你使用静态方法就不能调用,因为他还不存在,编译器可以在编译阶段就告诉你这样做是不行的!
回复 使用道具 举报
如果非静态方法调用了实例域,那么调用非静态方法也会使用到非静态变量。觉得这样可以吗
回复 使用道具 举报
钱程永 发表于 2014-7-13 11:54
非静态方法,是存储在哪里?对象怎么调用它?

所有方法代码,静态或非静态,都存储在方法区。当需要用时,则将传入的参数和相应的方法代码压入栈区,执行完毕后弹栈。
回复 使用道具 举报
路过!!!!!!!!!!!!!!!!!
回复 使用道具 举报
因为他俩跟本放的不是一个地方
静态方法存储在栈中,
而其他的非静态方法存储在堆中基本如图
栈   |   堆
静态 |  非静态
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马