黑马程序员技术交流社区

标题: 为什么静态方法不可以调用非静态方法? [打印本页]

作者: 钱程永    时间: 2014-7-13 00:37
标题: 为什么静态方法不可以调用非静态方法?
我可以理解,静态方法不可以调用非静态变量,但是不不能理解为什么不能调用非静态方法!希望知道的盆友可以给我解释一下,尽量详尽!谢谢!

作者: fantacyleo    时间: 2014-7-13 02:42
和不能调用非静态变量一样的原因:静态方法不与类的对象挂钩,而非静态方法必须由对象调用。每个非静态方法都有一个隐式参数this,代表调用方法的对象。调用静态方法时,根本就没有对象,this指向谁?
作者: cat73    时间: 2014-7-13 04:19
只是不可以直接调用而已
可以使用对象.方法()来调用的
作者: 风决    时间: 2014-7-13 05:41
静态方法与非静态方法,静太方法在对象生成前就已经分配内存---“属于类方法”,而此时非静态方法还没被分配内存---“属于对象方法”,静态方法可以不可以调用非静态方法,是因为当静态方法调用时,非静态方法可能还没分配内存,然后就会报错。
    我是这样理解的,希望对你有帮助。。。
作者: mytongyong    时间: 2014-7-13 06:00
cat73 发表于 2014-7-13 04:19
只是不可以直接调用而已
可以使用对象.方法()来调用的

我在一本书上看到过,对象.方法()来调用静态方法是java的一个缺陷,因为这样语义上不明确吧,静态方法是属于整个类的,而不是一个对象,而且从内存分配的角度也没法解释这种调用方法。所以尽量用类名.方法()来调用才是合理的。我记得C#就不支持对象.方法()来调用静态方法。
作者: 汉谟拉比    时间: 2014-7-13 07:17
因为静态方法存在的时候非静态方法还不存在
作者: cat73    时间: 2014-7-13 08:16
mytongyong 发表于 2014-7-13 06:00
我在一本书上看到过,对象.方法()来调用静态方法是java的一个缺陷,因为这样语义上不明确吧,静态方法是 ...

静态实际上可以减少资源消耗的
作者: 钱程永    时间: 2014-7-13 11:54
fantacyleo 发表于 2014-7-13 02:42
和不能调用非静态变量一样的原因:静态方法不与类的对象挂钩,而非静态方法必须由对象调用。每个非静态方法 ...

非静态方法,是存储在哪里?对象怎么调用它?
作者: 钱程永    时间: 2014-7-13 11:55
汉谟拉比 发表于 2014-7-13 07:17
因为静态方法存在的时候非静态方法还不存在

这种解释,那不是类似于静态变量ma?
作者: 大头喝果啤    时间: 2014-7-13 12:07
静态方法不能调用本类的非静态方法,因为静态方法是类直接调用的,不需要建立对象,既然没有对象,也就是内存里根本就还没有该对象的非静态方法,何从调用?!
作者: ss5619498    时间: 2014-7-13 13:11
因为他俩跟本放的不是一个地方
静态方法存储在栈中,
而其他的非静态方法存储在堆中基本如图
栈   |   堆
静态 |  非静态
作者: 渴望学习    时间: 2014-7-13 14:02
路过!!!!!!!!!!!!!!!!!
作者: fantacyleo    时间: 2014-7-13 14:09
钱程永 发表于 2014-7-13 11:54
非静态方法,是存储在哪里?对象怎么调用它?

所有方法代码,静态或非静态,都存储在方法区。当需要用时,则将传入的参数和相应的方法代码压入栈区,执行完毕后弹栈。
作者: 215041631    时间: 2014-7-13 14:16
如果非静态方法调用了实例域,那么调用非静态方法也会使用到非静态变量。觉得这样可以吗
作者: 215041631    时间: 2014-7-13 14:36
我仔细想了一下,我想应该是正确的:
非静态变量还有个名字叫实例域,故名思义他对象的属性。
如果当一个对象都还不存在的话,那么他也就不存在。
非静态方法其实跟上面的道理是一样,如果对象还不存在他也就不会在内存中加载进这个方法。如果要加载就浪费空间了所以当你使用静态方法就不能调用,因为他还不存在,编译器可以在编译阶段就告诉你这样做是不行的!

作者: 郑飞    时间: 2014-7-13 15:11
javac以后 只是加载了静态内容 而已非静态成员是依附于实例的 所以二者有先后
想调用非静态成员 要实例化出该成员所在的类的实例后 才能调用
作者: 张慈瑞    时间: 2014-7-13 15:38
因为静态方法随着类的创建而创建,而非静态方法是随着对象的创建而创建,所以,静态方法的生命周期比非静态的要长,不能调用还不存在的方法。
作者: 小七    时间: 2014-7-13 22:13
因为加载先后问题,静态随着类加载而加载,非静态要对象调用才加载,一个先加载的不可能调用一个还未加载的。
作者: mytongyong    时间: 2014-7-14 09:45
cat73 发表于 2014-7-13 08:16
静态实际上可以减少资源消耗的

是可以减少资源的消耗,呵呵,我说的仅仅是语义上的不明确,这样没办法区分是所调用的方法是静态方法还是非静态方法。如果要有严谨的定义或者区分的话,最好还是用类名.方法()吧。
作者: 双皮奶    时间: 2014-7-14 10:06
看看还是挺有帮助的
作者: 钱程永    时间: 2014-7-14 23:31
215041631 发表于 2014-7-13 14:36
我仔细想了一下,我想应该是正确的:
非静态变量还有个名字叫实例域,故名思义他对象的属性。
如果当一个对 ...

恩,懂了,谢谢:handshake:handshake:handshake
作者: 钱程永    时间: 2014-7-14 23:32
风决 发表于 2014-7-13 05:41
静态方法与非静态方法,静太方法在对象生成前就已经分配内存---“属于类方法”,而此时非静态方法还没被分 ...

恩,懂了。谢谢:handshake:handshake:handshake
作者: 付江涛    时间: 2014-7-14 23:39
mytongyong 发表于 2014-7-13 06:00
我在一本书上看到过,对象.方法()来调用静态方法是java的一个缺陷,因为这样语义上不明确吧,静态方法是 ...

李刚的书吧,C#就是把JAVA的坑给填了
作者: 郑阳阳    时间: 2014-7-15 09:01
静态方法是随着类的加载而加载的 而非静态方法是只有创建了对象才可以分配内存 没有对象是不存在的,所以不能调用
作者: tc庄稼汉    时间: 2014-7-15 09:25
mytongyong 发表于 2014-7-13 06:00
我在一本书上看到过,对象.方法()来调用静态方法是java的一个缺陷,因为这样语义上不明确吧,静态方法是 ...

C#里只能通过类名调用
作者: 南柯一梦    时间: 2014-7-15 13:42
静态成员是随着类的加载而加载的,而成员变量或函数是随着对象的加载而加载的,非静态方法需要被对象调用才执行,静态方法优先存在非静态方法,所以静态方法不可以调用非静态方法
作者: LFW    时间: 2014-7-15 18:42
fantacyleo 发表于 2014-7-13 02:42
和不能调用非静态变量一样的原因:静态方法不与类的对象挂钩,而非静态方法必须由对象调用。每个非静态方法 ...

我也是这样想的
作者: LFW    时间: 2014-7-15 18:43
mytongyong 发表于 2014-7-13 06:00
我在一本书上看到过,对象.方法()来调用静态方法是java的一个缺陷,因为这样语义上不明确吧,静态方法是 ...

但静态方法也是方法啊,特殊的方法一样有普通方法的特性。。我觉得对象.()方法没有不妥吧?
作者: Adjin    时间: 2014-7-16 11:31
调用方法只有两种方法:类名调用,对象调用
非静态方法只能对象调用,都没有对象,所以只能调用静态方法了
作者: yuli2039    时间: 2014-7-16 18:37
ss5619498 发表于 2014-7-13 13:11
因为他俩跟本放的不是一个地方
静态方法存储在栈中,
而其他的非静态方法存储在堆中基本如图

静态方法不是在栈内存中吧!应该是在方法区中。  




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