在一个静态方法中不能调用一个非静态方法。
改成下面的你,你对MulticastFrame已经创建了实例,当然可以啊。
你仔细看看书吧,think in java上说的很详细。

解决方案 »

  1.   

    在sun的sl-275中有明确说明:
    static:
    类变量(对象共享)可以用类名,对象名点取,间接使用。
      类方法 1)static方法中不能直接使用非静态成员, 因
                为非静态成员与实例相关,通过对象点取间接使用
        2)static方法中不能用this(与实例相关)   
         3)非static方法中可以使用static成员      
            static块:和数据成员时并列的位置,用于类初始化
          类装入时执行一次(第一次创建对象,第一次使用
     static成员,不同的静态块,按在类中的顺序执行)
                         注:只能修饰成员,不能修饰方法变量.
                    static方法覆盖时,没有起到覆盖的作用
      

  2.   

    我觉得这主要不是静态不静态的问题,应该是main()方法的问题。
    main()方法是在任何对象被创建之前就会被java解释器调用。如果按照你上面的做法,这时还没有创建mainframe这个对象,所以会报错。
      

  3.   

    楼上的好象道理要正确些。show也不应该是静态方法啊,是用对象调用的。我在JFrame类里居然没找到这个show方法,到底是在哪个类里的 啊?
      

  4.   

    to  namowen(寒号不已):
    按你的说法报错应该是说mainframe没创建吧??
    但错误是说non-static variable mainframe cannot be referenced from a static context mainframe.show();
    好象也不是你说的那样。
      

  5.   

    还是不太明白怎么回事。mainframe这个实例在main方法内创建和作为一个成员变量来创建有什么区别呢???
    mainframe这个实例在main方法内创建怎么就不会出错,而作为一个成员变量来创建就会出错了呢?
      

  6.   

    non-static variable mainframe cannot be referenced from a static context mainframe.show();
    这个错误不是说show是静态方法。context是上下文,指mainframe.show()方法
    所在的位置(main方法里),在这个静态方法main里不能引用非静态变量mainframe.mainframe这个实例作为一个成员变量来创建的话,在main里执行mainframe.show();的时候,Class C还没有实例,它的成员变量mainframe当然也不存在,所以错误。mainframe这个实例在main方法内创建的话,它是main方法内部的成员变量。
      

  7.   

    那这样的话,是不是mainframe这个实例必须放在main方法里呀?如果我在后面的函数中一定要用到这个实例,那该怎么办啊?
      

  8.   

    你最好把这两句:
    MulticastFrame mainframe=new MulticastFrame();
    mainframe.show();
    放到class C的构造方法中,然后再用到这个实例时,可以用this来引用。
      

  9.   

    我想用的是mainframe这个引用,也就是创建的主窗口,在后面怎么才能用上啊?!
      

  10.   

    一个声明为非静态的变量确实是不能在静态的方法里面引用的,如果这样会出现一个编译错误,因为我们知道静态的方法可以在没有创建实例时使用,而申明为非静态的成员变量是一个对象属性,它只有在对象存在时引用,但是如果在对象未创建实例时我们调用了它的类方法(静态方法)这时可想而知了(肯定是非法的不能再非法了),所以编译器会在这种时候给各错误.而且java语法这也是不允许的(如同C++一样,静态方法只能引用静态的属性,进行处理).
      

  11.   

    我来解释一下把,不一定对首先要明确java规范中确实是在静态方法中不能调用非静态方法或则引用非静态变量,这个大家没有问题把然后我们看这个
    class C
       {
    public static void main(String[] args)
         {
              mainframe.show();
         }
    public MulticastFrame mainframe=new MulticastFrame();
    }这个类里面mainframe没有用static修饰,所以不是非静态成员变量,所以会出错再看这个
    class C   
    {
       public static void main(String[] args)
         {
             MulticastFrame mainframe=new MulticastFrame();
             mainframe.show();
         }
    }mainframe是在方法里面声明的局部变量当然不存在什么静态非静态了啊,所以静态方法调用自己方法内部的变量是不会出问题的。静态非静态是对类的成员变量来说的,不适合局部变量的:)