无法从静态上下文中引用非静态变量 this

sunxiasheng 2008-05-12 09:53:24
下面的代码是孙鑫老师java教程里面的一个多线程的例子,在我的机子上就是调试不通。请指教为何出错,如何修改。谢谢。
public class MultiThread
{
public static void main(String args[])
{
MyThread mt = new MyThread();
mt.start();
System.out.println("main:" + Thread.currentThread().getName() );//显示当前线程的index
}

class MyThread extends Thread
{
//产生一个线程
public void run()
{
System.out.println(getName());
}

}
}


无法从静态上下文中引用非静态 变量 this
MyThread mt = new MyThread();
...全文
910 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
CYBEREXP2008 2011-07-22
  • 打赏
  • 举报
回复

private static MyThread mt = null;
mt = new MyThread();

ImJaden 2011-05-23
  • 打赏
  • 举报
回复
哈哈,一定要认真呀////
sol_dark 2009-12-18
  • 打赏
  • 举报
回复
5楼大神啊,太感谢了
jiawei260 2008-10-16
  • 打赏
  • 举报
回复
强啊,我也是学到这里遇到这种情况呢。
现在解决啦
fengalon_software 2008-05-12
  • 打赏
  • 举报
回复
class MultiThread // public class MultiThread
貌似你的能编译的那个代码不正规!
一个java文件中,而且public后的类名必须是你文件名
public class (类名) public 必须有
sunxiasheng 2008-05-12
  • 打赏
  • 举报
回复
^_^ 我发现错误了 是大括号的问题!!!!!! 大家都要细心些哈!!!还是多谢楼上帮忙
sunxiasheng 2008-05-12
  • 打赏
  • 举报
回复
class MultiThread
{
public static void main(String args[])
{
MyThread mt = new MyThread();
mt.start();
System.out.println("main:" + Thread.currentThread().getName());
}
}

class MyThread extends Thread
{
public void run()
{
System.out.println(getName());
}
}
我重新敲了一遍代码,结果什么都没有改,居然就可以运行了!!!!有细心的人可以帮我找到最开始的代码和现在的代码有什么不同么?
hoszone 2008-05-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 anqini 的回复:]
因为你这个class MyThread extends Thread 是内部类,还有,它是非静态方法!
所以MyThread mt = new MyThread();可以表现为
MyThread mt = this.new MyThread();//这里this是被隐藏的,当你实例化非静态内部类的时候,必须有它外部类的引用,所以这里有隐藏的this!所以报这个错误!

可以改为这样!

MultiThread t = new MultiThread();
MyThread mt = t.new MyThread();
[/Quote]
anqini 2008-05-12
  • 打赏
  • 举报
回复
因为你这个class MyThread extends Thread 是内部类,还有,它是非静态方法!
所以MyThread mt = new MyThread();可以表现为
MyThread mt = this.new MyThread();//这里this是被隐藏的,当你实例化非静态内部类的时候,必须有它外部类的引用,所以这里有隐藏的this!所以报这个错误!

可以改为这样!

MultiThread t = new MultiThread();
MyThread mt = t.new MyThread();
yuppy 2008-05-12
  • 打赏
  • 举报
回复
静态变量不用产生对象就可以使用,而非静态变量必须在对象中条用!所以是不可以调用的;
sunxiasheng 2008-05-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 guoqiangone 的回复:]
静态方法中当然不能掉用非静态的变量
除非把变量定义为静态变量,这样就可以引用了

System.out.println(getName()); //看看这个打印的什么吧
[/Quote]

麻烦给出修改后的代码吧 谢谢
lovingprince 2008-05-12
  • 打赏
  • 举报
回复
这个有什么问题么?静态上下文中是不能引用this啊,this代表的是当前对象。因为静态的东西不属于任何对象,他是所有对象共享的,如果你用this,他根本不知道你指代的是哪个对象。

这里MyThread mt和Thread.currentThread()是两个不同的线程,打印出来的结果应该不一样
guoqiangone 2008-05-12
  • 打赏
  • 举报
回复
静态方法中当然不能掉用非静态的变量
除非把变量定义为静态变量,这样就可以引用了

System.out.println(getName()); //看看这个打印的什么吧

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧