黑马程序员技术交流社区

标题: 无法从静态上下文引用非静态方法是什么意思? [打印本页]

作者: 钟成军    时间: 2012-5-2 13:54
标题: 无法从静态上下文引用非静态方法是什么意思?
class Outer
{
int x = 3;
void method(final int a )
{
  final int  y = 4;
  class Inner
  {
   void function()
   {
    System.out.println( a);
   }
  }
  new Inner().function();
}
}
class  InnerClassDemo3
{
public static void main(String[] args)
{
  Outer out = new Outer();
  Outer.method(7);
  Outer.method(8);
}
}

以上java程序在编译时提示Outer.method(7);
  Outer.method(8);
两个引用非法,即不能从静态上下文引用非静态方法。
void method(final int a )
{
  final int  y = 4;
  class Inner
  {
   void function()
   {
    System.out.println( a);
   }
  }
  new Inner().function();
}
是不是在这个     void method(final int a )      的前面一定要加上static 修饰才可以编译成功?


作者: 贾联国    时间: 2012-5-2 14:04
本帖最后由 贾联国 于 2012-5-2 14:25 编辑

这里必须用对象调用非静态方法,你已经建立的对象,就用
Outer out = new Outer();
   out.method(7);
   out.method(8);

看来是LZ手误

作者: 刘基军    时间: 2012-5-2 14:07
Outer.method(7); //这样写,表示method()应该是一个静态的方法,而代码中实际不是静态的,所以报非法引用错误
                 //另外,main是静态方法,要想在其中访问非静态方法,就必须创建其对象,然后使用"对象名.method()"来访问
解决方法:
使用: out.method(7); 或者 method()加static修饰

作者: 倪杭乘    时间: 2012-5-2 14:12
非静态方法不能被类名直接调用,如果要调用要创建Outer对象。把方法改成static,那就可以直接用类名调用
作者: 隋营营    时间: 2012-5-2 14:23
静态方法中不能调用非静态方法
非静态方法可以调用静态方法
作者: 金肖    时间: 2012-5-2 14:42
因为主函数main是静态的,所以如果要访问外部成员时,需要对象调用,楼主既然创建了对象直接用:
out.method(7);
out.method(8);
作者: 永恒之翼网络    时间: 2012-5-2 14:57
你这段代码错误的原因在“Outer.method(7); Outer.method(8);”用类名.调用了非静态的方法,类名.只能调用静态的方法。所以把“Outer.method(7); Outer.method(8);”改成“out.method(7),out.method(8);”或者在 void method(final int a)前添加static都行。
作者: 钟成军    时间: 2012-5-2 18:34
贾联国 发表于 2012-5-2 14:04
这里必须用对象调用非静态方法,你已经建立的对象,就用
Outer out = new Outer();
   out.method(7);

恩,是手误,开始找了好久没有找到问题所在,谢谢啦:handshake




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2