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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

29 个回复

倒序浏览
和不能调用非静态变量一样的原因:静态方法不与类的对象挂钩,而非静态方法必须由对象调用。每个非静态方法都有一个隐式参数this,代表调用方法的对象。调用静态方法时,根本就没有对象,this指向谁?
回复 使用道具 举报
cat73 黑马帝 2014-7-13 04:19:32
藤椅
只是不可以直接调用而已
可以使用对象.方法()来调用的
回复 使用道具 举报 1 0
静态方法与非静态方法,静太方法在对象生成前就已经分配内存---“属于类方法”,而此时非静态方法还没被分配内存---“属于对象方法”,静态方法可以不可以调用非静态方法,是因为当静态方法调用时,非静态方法可能还没分配内存,然后就会报错。
    我是这样理解的,希望对你有帮助。。。
回复 使用道具 举报
cat73 发表于 2014-7-13 04:19
只是不可以直接调用而已
可以使用对象.方法()来调用的

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

静态实际上可以减少资源消耗的
回复 使用道具 举报
fantacyleo 发表于 2014-7-13 02:42
和不能调用非静态变量一样的原因:静态方法不与类的对象挂钩,而非静态方法必须由对象调用。每个非静态方法 ...

非静态方法,是存储在哪里?对象怎么调用它?
回复 使用道具 举报
汉谟拉比 发表于 2014-7-13 07:17
因为静态方法存在的时候非静态方法还不存在

这种解释,那不是类似于静态变量ma?
回复 使用道具 举报
静态方法不能调用本类的非静态方法,因为静态方法是类直接调用的,不需要建立对象,既然没有对象,也就是内存里根本就还没有该对象的非静态方法,何从调用?!
回复 使用道具 举报
因为他俩跟本放的不是一个地方
静态方法存储在栈中,
而其他的非静态方法存储在堆中基本如图
栈   |   堆
静态 |  非静态
回复 使用道具 举报
路过!!!!!!!!!!!!!!!!!
回复 使用道具 举报
钱程永 发表于 2014-7-13 11:54
非静态方法,是存储在哪里?对象怎么调用它?

所有方法代码,静态或非静态,都存储在方法区。当需要用时,则将传入的参数和相应的方法代码压入栈区,执行完毕后弹栈。
回复 使用道具 举报
如果非静态方法调用了实例域,那么调用非静态方法也会使用到非静态变量。觉得这样可以吗
回复 使用道具 举报
我仔细想了一下,我想应该是正确的:
非静态变量还有个名字叫实例域,故名思义他对象的属性。
如果当一个对象都还不存在的话,那么他也就不存在。
非静态方法其实跟上面的道理是一样,如果对象还不存在他也就不会在内存中加载进这个方法。如果要加载就浪费空间了所以当你使用静态方法就不能调用,因为他还不存在,编译器可以在编译阶段就告诉你这样做是不行的!
回复 使用道具 举报
javac以后 只是加载了静态内容 而已非静态成员是依附于实例的 所以二者有先后
想调用非静态成员 要实例化出该成员所在的类的实例后 才能调用
回复 使用道具 举报
因为静态方法随着类的创建而创建,而非静态方法是随着对象的创建而创建,所以,静态方法的生命周期比非静态的要长,不能调用还不存在的方法。
回复 使用道具 举报
因为加载先后问题,静态随着类加载而加载,非静态要对象调用才加载,一个先加载的不可能调用一个还未加载的。
回复 使用道具 举报 1 0
cat73 发表于 2014-7-13 08:16
静态实际上可以减少资源消耗的

是可以减少资源的消耗,呵呵,我说的仅仅是语义上的不明确,这样没办法区分是所调用的方法是静态方法还是非静态方法。如果要有严谨的定义或者区分的话,最好还是用类名.方法()吧。
回复 使用道具 举报
看看还是挺有帮助的
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马