java编程之 - 内部类小陷阱

《java核心技术》卷一第八版,P223-225.讲到的内部类相关知识。这里我随手写了一个小玩具。主要分辨一下内部类和局部内部类,具体的步骤和问题,都在注释中:

/**
 * Created by likai on 14-7-28.
 */

interface Cheatable {
    void printFuck();
}

class Outter {
    public Outter() {
        i=0;
    }

    public void myPrint() {

        //局部内部类,也实现了Cheatable接口
        class Inner implements Cheatable {
            //a method:printFuck().
            public void printFuck() {
                int i;
                System.out.println("local inner class:a fuck trap!!!");

                //下面这段代码块没别的意思,只是想展示一下外部类成
                // 员、内部类成员、局部变量三者的调用区别。
                {
                    Outter.this.i = 0;
                    this.i = 0;
                    i = 0;
                }
            }
            private int i;
        }

        //请分析下面的问题:
        Inner inner1        = new Inner();
        Outter.Inner inner2 = new Inner();
        Inner inner3        = this.new Inner();
        Outter.Inner inner4 = Outter.this.new Inner();
        inner1.printFuck(); //#1
        inner2.printFuck(); //#2
        inner3.printFuck(); //#3
        inner4.printFuck(); //#4

        /* #1-4处会依次输出什么?
        * 答案:
        *  #1:local inner class:a fuck trap!!!
        *  #2:编译出错,inner2类型不兼容。
        *  #3:编译出错,inner3类型不兼容。
        *  #4:inner class: a fuck trap!!!
        * 原因:this.new 和new的区别。
        * */

        Cheatable c1 = this.new Inner();
        Cheatable c2 = new Inner();
        c1.printFuck();  //#5
        c2.printFuck();  //#6
        /* #5-6会输出什么?
        * 答案:
        * #5:inner class:a fuck trap!!!
        * #6:local inner class:a fuck trap!!!
        *原因:依然是this.new和new的区别。注意此处两个引用都是Cheatable类型,更容易迷惑人。
        * */




    }

    //内部类,实现了Cheatable接口
    class Inner implements Cheatable {
        //a method:printFuck().
        public void printFuck() {
            System.out.println("inner class: a fuck trap!!!");
        }
    }

    private  int i;
}

//测试
public class InnerClassTest {
    public static void main(String[] args) {
        Outter o = new Outter();
        o.myPrint();
    }
}


你可能感兴趣的:(编程点滴)