黑马程序员技术交流社区

标题: 静态与非静态的问题(新手求教) [打印本页]

作者: 系磊    时间: 2012-8-3 11:29
标题: 静态与非静态的问题(新手求教)
  我们都知道静态方法不能调用非静态方法,而非静态方法通常是以实例变量来影响该方法的行为.我想问如果非静态方法没有用到实例变量,而从静态方法调用非静态方法这样的话能通过编译么?为什么?
作者: 焦晨光    时间: 2012-8-3 11:44
本帖最后由 焦晨光 于 2012-8-3 11:49 编辑

不能!
非静态方法没有用到实例变量,但它依然是一个实例方法,所以它只有在创建了该类的对象以后才分配内存。
而静态方法当程序开始运行时,静态方法已经在内存中被分配了空间,有了入口地址。可以被直接访问。

不管你的非静态方法中是否使用了实例变量,它依然依赖于类的存在而存在,不能访问静态方法!

一句话,静态方法先存在,非静态方法后存在,静态方法不能超前访问。
作者: 周坤    时间: 2012-8-3 11:57
静态方法是随着类的加载而加载,优先于对象存在。被所有对象共享,可以直接被类名调用。
而非静态方法是随着对象的实例化,才能调用。
所以静态方法无论如何都不能直接调用非静态方法,因为静态方法存在的时候,还没有创建对象,所以无法调用非静态方法。

不过若是在静态方法中new一个类,通过这个类是可以调用非静态方法的。
比如:
  1. public class good {
  2.         int m=5;
  3.         static void method(){
  4.                
  5.                 int i=4;
  6.                 System.out.println(i);
  7.                
  8.                 new good().method2();//[color=Red]此时是通过对象调用的,但不能直接调用
  9. [/color]               
  10.         }
  11.         void method2(){
  12.                 System.out.println(m);
  13.         }
  14.     public static void main(String [] args)
  15.     {
  16.             method();
  17.     }
  18. }
复制代码
打印结果为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