请问,在java中main函数是作为java程序的入口,同时也是当前类的一个静态的方法(函数)那么请问,如果main方法所在的类中有一个int i=5的变量,为什么在main中不能直接访问i,而在同一个类中再定义一个函数(无论是静态的还是什么状态的),都可以直接访问变量i,想请问一下,这是sun公司所定义的规范还是有其它的说法,在线等待解决,谢谢各位朋友来解答小弟的这人愚蠢问题.

解决方案 »

  1.   

    正好,我在一个论坛也是碰到问为什么String是final类型的...斑竹这样给我找的答案
     
    http://bobcat.webappcabaret.net/javachina/faq/09.htm#mis_Q40 Q. Why Java does this? Why Java does that? A: 
    To computer languages or natural languages, I always prefer to ask what and how instead of why. Even though I know there are a lot of good and bad reasons behind them. The good ones make the language vital and successful, the bad ones make future improvement and replacement possible. Languages (natural and programming languages included) are not rigorous science, a lot of human factors are involved. To programming languages, another factor is the cost. This is a more philosophical and time-efficient decision of mine. You can make yours different than mine, of course. Sorry, it is usually not a very satisfactory answer for you. 确实是个好主义.不要考虑太多为什么.有些必须的为什么研究一下就行了.让大脑不要太过束缚.另外回答这个问题,因为main函数是static的啊.必须在静态方法里调用静态的成员.int类型没定义为static所以当然不能直接访问咯.你重新建一个类定义成static一样不能访问.
    至于为什么static的方法不能调用非静态的成员..个人不理解,也不想去了解.就像不需要知道为什么人是怎么消化食物一样的道理...
    知道how有时比知道what要好很多的说~~
      

  2.   

    我来胡说:
    static  是在类编译时就已经生成了! 也只生成一次
    而非static 是在对象被创建时候生成的!被多次生成
      

  3.   

    不是编译,在该类加载到VM中时就被赋值!
    举个例子吧!
    public class MyObject{
        
        static String strTmp = "";
        String str = "";
    }
    当 new MyObject() 时 str 属性被生成
    当 MyObject 类被加载时 strTmp 属性被生成
    多个MyObject实例 可以公用一个strTmp 而 str是每个事例都独有的
    不知道说明白,我也是一知半解
    至于你问的 “这是sun公司所定义的规范还是有其它的说法”
    我想这个应该是实际开发中的一种方便应用!
    如果没有static 单子模式该如何实现呢?
    说错了,麻烦大家给指点下!
      

  4.   

    static实际只引用了C++的一个关键词,实际上他并不是所谓的静态的.
    你可以把他理解成一个全局的方法或者成员.
    也就是说一个普通的int引用a.你创建他N次,他就在内存中存在了n个指示.但是static不管你建立多少个他的对象,他就只一个 a..
    我是这种方法记忆的:
    static 1指N
    普通的 N指N....
    也不知道说错没=.=但这样理解起来还是不错的
      

  5.   

    同意一楼,有些东西不好理解只有强记,sun既然是这样做的必定有他这样做的好处,至于为什么,可能要等以后很熟悉后再探究.
      

  6.   

    做个小程序试一下
    public class StaticClass
    {
    static int i = 5;

    public static void main(String args[])
    {
    System.out.println(i);
    }
    }第三行如果这么写:“int i =5;”编译器就会报错:“E:\java\StaticClass.java:7: non-static variable i cannot be referenced from a static context
    System.out.println(i);//
                                       ^
    1 error”非静态变量I,不能从一个静态方法内部被访问
      

  7.   

    唉,结合楼上几位朋友所述刚算有一点形容但是又忽生一疑问:
    class Aa
    {
    static void qq()
    {
    static int i=100;
    }
    }
    这样写总算没有什么问题了吧,怎么还是报错呢,没有道理啊?各位说对吗?如果按照各位说的那样,
      

  8.   

    class Aa
    {
    static void qq()
    {
    static int i=100;
    }
    }本身是静态方法了的了,在编译时后就存在了,方法里的变量也是如些.
    这个局部变量外部是不可以访问的.所以方法内部作静态变量没有意义.
      

  9.   

    不会吧,没有意义SUN公司就提示错误?
    还有,qq()静态方法在编译的时候就已经存在了,不错这个我知道,但是i也是编译的时候就存在了啊,
    你说,这个局部变量外部是不可以访问的( 变量指i),但是如果把static int i=100改成int i=100
    则可以访问(此时先不说static放在这里合不合理),static 更应该可以访问啊,你说是吗?