public static void main(String args[]) {
final Outputter outputter = new Outputter(); new Thread() {
public void run() {
outputter.output("zhangsan"); }
}.start();
为什么实例化Outputter时,需要定义为final,要不就报错。

解决方案 »

  1.   

    Thread类里没有叫outputter的属性,调用不到它。
    要么你就写一个Thread的子类,加上这个属性,创建对象的时候把outputter给它传进去。
      

  2.   

    那我直接改为 static {Outputter outputter = new Outputter()}不就行了?可还是报错
      

  3.   

    public class TraditionalThreadSynchronized { static Outputter outputter = new Outputter(); public static void main(String args[]) {}}
    这种写法是没问题的。但
    public class TraditionalThreadSynchronized { public static void main(String args[]) {
    static Outputter outputter = new Outputter();
    }
    }是不容许的。
    对象不能定义为局部静态?
      

  4.   

    你这是方法里的静态块,不是创建静态变量。至少得这样:public class Test {
        public static void main(String args[]) {
            new Thread() {
                public void run() {
                    Outputter.outputter.output("zhangsan");            }
            }.start();
        }
    }class Outputter {
        public static Outputter outputter = new Outputter();    public void output(String str) {
            // TODO
        }
    }
      

  5.   

    new Thread() {
    public void run() {
    outputter.output("zhangsan");}
    }.start();
    这是内部类,你的outputter是局部变量,它的生命周期只是这个方法中,但是这个内部类的生命周期就不是这个方法中了,所以你不可以直接使用,必须声明为final
      

  6.   

    准确来说 static是属于类的,而不是方法体
      

  7.   

    说白了就是run()执行完后,局部变量outputter会清除,但outputter是在全局中定义的,所以是矛盾不合法的
      

  8.   

    #6说的对,跟线程没太大关系。这是内部类的特性,为了保证outputter的声明周期为其内部类使用。
      

  9.   

    inner class调用outer class的variable必须将其声明为final。
    你要把他变成instance field也能调用。