main()并不是直接调用x.prt(),而是通过abc的对象实例来调用。
"无法在static方法中调用non-static方法"是指无法在main中直接调用prt方法。“无法在static方法中调用non-static方法”是指:
public static void main(String args[])  {
   prt();
}
的情形。

解决方案 »

  1.   

    嗯,楼上正解!静态还是尽量少用,所以推荐x.prt()这种调用,而不是好多都写成静态的!
      

  2.   

    是的。void prt()System.out.println("dsfsff");}         {改成   static void prt(){System.out.println("dsfsff");}调用的是这个静态过程。建议不要常使用static静态/ 
      

  3.   

    对的 要是按你那样的理解 定义static方法还有什么用啊  反正又不能访问哈哈 所以 一楼说的是对的咯
      

  4.   

    1楼说的很对。基于同样的道理,你也不可以直接调用non-static成员 如:
     public class abc
        {
           pvivate int i=100;
           public static void main(String args[])
              {
                System.out.println(i);
              }
        }
     那么,上面的代码就不会通过编译,但你可以在non-static函数中调用对象的变量或函数如
       public class Test
        {
           pvivate int i=100;
           public void print(){
                System.out.println("Test class");
              }
           public static void main(String args[])
              {
                  Test test=new Test();
                  System.out.println(test.i);
                  test.print();
              }
        }
      

  5.   

    static时Stack级别的,性能上比non-static好很多.它能在没有创建类对象时被调用.而且,对于某些情况如工厂方法等很有用."无法在static方法中调用non-static方法",是指无法在static方法中直接使用non-static方法.如楼主代码所示,main是调用了本函数的一个对象x.
      

  6.   

    其实主要是这句“无法在static方法中调用non-static方法”表述的不够清楚,所以楼主产生了误解,这种问题不结合例子的话,是很难让人完全理解的。
      

  7.   

    这句“无法在static方法中调用non-static方法”表述是指不能调用在static方法作用域之外的non-static方法或成员,就拿楼主的例子程序来说:
    public class abc
        {
           void prt()
             {System.out.println("dsfsff");}
           public static void main(String args[])
              {
                abc x = new abc();
                x.prt();  //此处不是调用了非静态方法吗???
                /*
                 此处是调用了非静态方法但是它是在static方法定义的对象x中的方法,
                 x是在main方法中定义的x的作用域仅在main方法之内,随main方法的结束
                 而释放,如果此处直接调用prt()方法则prt()方法不是在main中定义的它
                 作用域在main方法之外所以就会报无法在static方法中调用non-static方法。
                */
              }
        }
      

  8.   

    我给你举个例子你就明白了!(不要着急,漫漫来,我给你举这个例子,包你明白!)
    public class abc
        {
           void prt()
             {System.out.println("dsfsff");}  // 此处是非静态方法,在静态中不可以用非静态的东西,没错!!但是你往下看!
           public static void main(String args[])
              {
                abc x = new abc();// 此处你在静态方法中声明了一个对象!此对象引址可是静态的!
                x.prt();  //所以你用的东西是静态的,你并没错!!
              }
        }
    如果你不声明一个静态的对象引址,你就得这样了,否则就错了!!看例子:
    public class abc
        {
          static void prt()  //  注意,你必须加上static,否则错!
             {System.out.println("dsfsff");}
           public static void main(String args[])
              {
                
                abc.prt();  // 可以了
               }
        }