为什么此段代码报错?
(注:变量i前加final能运行并且通过,因为final是全局变量,程序开始运行时先运行final常量)
重点是为什么原程序就通不过,谁给解释一下为什么
内部类调用外部的变量为什么不可以呢(不加final)

解决方案 »

  1.   

    class InnerDemo
    {
    int in=5;
    void test()
    {
    int i=5;
    class Inner
    {
    InnerDemo inner;
    Inner()
    {
    }
    public Inner(InnerDemo inner)
    {
    this.inner=inner;
    }
    void dispaly()
    {
    System.out.println("in等于"+inner.in);
    System.out.println("in等于"+InnerDemo.this.in);
    System.out.println("in"+in);
    System.out.println(i);

    }
    }
    Inner inner=new Inner(this);
    inner.dispaly();

    }
    public static void main(String []args)
    {
    InnerDemo id=new InnerDemo();
    id.test();
    }
    }/*public class InnerDemo
    {
    private int test;
    public class Inner
    {
    public void test()
    {
    System.out.println(test++);
    }
    }
    }
    class test
    {
    public static void main(String []args)
    {
    InnerDemo innnerdemo=new InnerDemo();
    innerDemo.Inner inner=innerdemo.new Inner();
    inner.test();
    }
    }*/
    /*
    public class InnerDemo
    {
    private int size;
    public class Inner
    {
    private int size;
    public void test(int size)
    {
    size++;//引用的是test函数的形参;
    this.size++;//引用的是Inner类中的成员变量;
    InnerDemo.this.size++;//引用的InnerDemo类中的成员变量;
    }
    }
    }
    */
    /*
    class InnerDemo
    {
    int in=5;
    void test()
    {
    Inner inner=new Inner(this);
    inner.dispaly();
    }
    public static void main(String []args)
    {
    InnerDemo id=new InnerDemo();
    id.test();
    }
    }class Inner
    {
    InnerDemo inner;
    Inner()
    {
    }
    public Inner(InnerDemo inner)
    {
    this.inner=inner;
    }
    void dispaly()
    {
    System.out.println("in等于"+inner.in);
    }
    }
    *//*
    class InnerDemo
    {
    static int in=5;
    void test()
    {
    Inner in=new Inner();
    in.Inner();
    }
    public static void main(String []args)
    {
    InnerDemo id=new InnerDemo();
    id.test();
    }
    }
    class Inner
    {
    void Inner()
    {
    int in=InnerDemo.in;
    System.out.println("in等于"+in);
    }
    }
    */
    /*
    class InnerDemo
    {
    int in=5;
    void test()
    {
    Inner inner=new Inner();
    inner.dispaly(in);
    }
    public static void main(String []args)
    {
    InnerDemo id=new InnerDemo();
    id.test();
    }
    }class Inner
    {
    int in;
    Inner()
    {
    }
    void dispaly(int in)
    {
    this.in=in;
    System.out.println("in等于"+in);
    }
    }
    */
    /*
    class InnerDemo
    {
    int in=5;
    void test()
    {
    Inner in=new Inner();
    in.Inner();
    }
    class Inner
    {
    void Inner()
    {
    System.out.println("in等于"+in);
    }
    }
    public static void main(String []args)
    {
    InnerDemo id=new InnerDemo();
    id.test();
    }
    }
    */
      

  2.   

    class InnerDemo
    {
        int in=5;
        void test()
        {
            Inner in=new Inner();
            in.Inner();
        }
        class Inner
        {
            void Inner()
            {
                System.out.println("in等于"+in);
            }
        }
      
    }
    public class Test {
    public static void main(String[] args) {
     InnerDemo id=new InnerDemo();
            id.test(); }
    }
      

  3.   

    为什么void test()里面Inner类里void despaly()方法不能调用i=5
      

  4.   

    局部变量    不是静态的class InnerDemo
    {
        int in=5;
        void test()
        {
            Inner inner=new Inner();
            inner.dispaly(in);
        }
        public static void main(String []args)
        {
            InnerDemo id=new InnerDemo();
            id.test();
        }
    }class Inner
    {
        int in;
        Inner()
        {
        }
        void dispaly(int in)
        {
            this.in=in;
            System.out.println("in等于"+in);
        }
    }
    public class MainDemo
    {    public static void main(String []args)
        {      
         InnerDemo i=new InnerDemo();
        }
    }
      

  5.   

    如果不是final的变量会出现什么情况呢?class A
    {
    final int i;
    class B
    {
    }
    }
    如果i不是final的 那么在B读取i值后(还没使用),A改变i的值,那么i等于多少呢?so,i必须为final
      

  6.   

    和可以不可以改变无关,只和生命周期有关。假设下面的代码void foo() {
      int x = 0;
      new Thread() {
        public void run() {
          for (;;) {
            System.out.println(x);
          }
        }
      }.start();
      // X dies here
    }如果只是int x,这是一个局部变量,在foo()方法执行完以后,就死掉了,而内部类里面,线程的执行是无穷尽的,需要永远能够访问外部类的x。在其他例子里面,可能是只用一次,但是不知道什么时候用(比如内部类是个事件监听器)。这就是一个冲突。因此,需要标注final,改变其生命周期