黑马程序员技术交流社区
标题:
静态与非静态的问题(新手求教)
[打印本页]
作者:
系磊
时间:
2012-8-3 11:29
标题:
静态与非静态的问题(新手求教)
我们都知道静态方法不能调用非静态方法,而非静态方法通常是以实例变量来影响该方法的行为.我想问如果非静态方法没有用到实例变量,而从静态方法调用非静态方法这样的话能通过编译么?为什么?
作者:
焦晨光
时间:
2012-8-3 11:44
本帖最后由 焦晨光 于 2012-8-3 11:49 编辑
不能!
非静态方法没有用到实例变量,但它依然是一个实例方法,所以它只有在创建了该类的对象以后才分配内存。
而静态方法当程序开始运行时,静态方法已经在内存中被分配了空间,有了入口地址。可以被直接访问。
不管你的非静态方法中是否使用了实例变量,它依然依赖于类的存在而存在,不能访问静态方法!
一句话,静态方法先存在,非静态方法后存在,静态方法不能超前访问。
作者:
周坤
时间:
2012-8-3 11:57
静态方法是随着类的加载而加载,优先于对象存在。被所有对象共享,可以直接被类名调用。
而非静态方法是随着对象的实例化,才能调用。
所以静态方法无论如何都不能直接调用非静态方法,因为静态方法存在的时候,还没有创建对象,所以无法调用非静态方法。
不过若是在静态方法中new一个类,通过这个类是可以调用非静态方法的。
比如:
public class good {
int m=5;
static void method(){
int i=4;
System.out.println(i);
new good().method2();//[color=Red]此时是通过对象调用的,但不能直接调用
[/color]
}
void method2(){
System.out.println(m);
}
public static void main(String [] args)
{
method();
}
}
复制代码
打印结果为4,5
作者:
胡刚涛
时间:
2012-8-3 12:06
不能 楼上的已经把两者的关系说的很好了 ,我补充一下: 编译器是一句一句检查代码的,当检查到非静态的方法调用静态方法是会报告错误。
作者:
系磊
时间:
2012-8-3 12:25
了解了,谢谢各位了
作者:
王峰
时间:
2012-8-3 13:00
静态变量,静态方法,是随着类的加载而加载; 但是实例变量,方法是随着对象实例化时分配系统资源的,
实例方法可以调用静态方法,静态方法不能调用实例方法和变量
作者:
徐小骥
时间:
2012-8-3 13:40
你可以看看我的博客,http://blog.163.com/it_xuxiaoji/blog/static/210055117201272112926607/
希望能帮助你
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2