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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 系磊 初级黑马   /  2012-8-3 11:29  /  2172 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  我们都知道静态方法不能调用非静态方法,而非静态方法通常是以实例变量来影响该方法的行为.我想问如果非静态方法没有用到实例变量,而从静态方法调用非静态方法这样的话能通过编译么?为什么?

评分

参与人数 1技术分 +1 收起 理由
包晗 + 1 鼓励一下

查看全部评分

6 个回复

倒序浏览
本帖最后由 焦晨光 于 2012-8-3 11:49 编辑

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

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

一句话,静态方法先存在,非静态方法后存在,静态方法不能超前访问。
回复 使用道具 举报
静态方法是随着类的加载而加载,优先于对象存在。被所有对象共享,可以直接被类名调用。
而非静态方法是随着对象的实例化,才能调用。
所以静态方法无论如何都不能直接调用非静态方法,因为静态方法存在的时候,还没有创建对象,所以无法调用非静态方法。

不过若是在静态方法中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
回复 使用道具 举报
不能 楼上的已经把两者的关系说的很好了 ,我补充一下: 编译器是一句一句检查代码的,当检查到非静态的方法调用静态方法是会报告错误。
回复 使用道具 举报
了解了,谢谢各位了
回复 使用道具 举报
静态变量,静态方法,是随着类的加载而加载; 但是实例变量,方法是随着对象实例化时分配系统资源的,
实例方法可以调用静态方法,静态方法不能调用实例方法和变量
回复 使用道具 举报
你可以看看我的博客,http://blog.163.com/it_xuxiaoji/blog/static/210055117201272112926607/
希望能帮助你
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马