内部类

含义:定义在类内部的类。

分类:成员内部类(静态、非静态)、匿名内部类、局部内部类(少见,了解即可)。

特点:四个修饰符随意用,class文件是“外部类¥内部类.class”。

成员内部类

位置:类中方法外。

A:非静态内部类

特性:内部类可直接访问外部类成员,外部类不可直接访问内部类非静态成员。

不能有静态方法/代码块/属性。

外部类静态方法/代码块不可访问非静态内部类。

实例:

package com.itcode.demo2;  

/**      
 * @author: 成都码到功成学员  
 * @Description:  
 *  非静态内部类 
 */  
public class TestOI {  
    public static void main(String[] args) {  
        // 访问非静态内部类的方式。  
        Outer.Inter oi = new Outer().new Inter();  
        oi.show();  
    }  
}  
class Outer {  
    private int a=10;  
    // 内部类  
    class Inter{  
        private int a =20;  
        public void show() {  
            int a = 30;  
            System.out.println("外部类成员变量:"+Outer.this.a);  
            System.out.println("内部类成员变量:"+this.a);  
            System.out.println("内部类局部变量:"+a);  
        }  
    }  
}

效果:

B:静态内部类

格式:static class Inter{}

核心理解:可以把它看做外部类的一个静态成员。

实例

package com.itcode.demo2;  

/**      
 * @author: 成都码到功成学员  
 * @Description:  
 *  静态内部类 
 */  
class Outer2 {  
    // 静态内部类  
    static class Inter{  

    }  


}  
public class TestOI2 {  
    public static void main(String[] args) {  
        /* 
         * 访问静态内部类的方式。 
         * 关于下面Inter为什么不用再new,是因为Inter加静态,直接在方法区拿来用。 
         */  
        Outer2.Inter oi = new Outer2.Inter();  

    }  
}

匿名内部类

没有名字仅仅调用一次的类。

匿名内部类是一个隐式的继承某类或实现某该接口的子类匿名对象

使用场景:比如增加窗口关闭监听,键盘按下监听。

记住:没有修饰符和构造方法.

package com.itcode.demo2;  

/**      
 * @author: 成都码到功成学员  
 * @Description:  
 *  匿名内部类的使用 
 */  
interface Oi3{  
    void name();  
}  
public class TestOI3{  
    public static void main(String[] args) {  
        Oi3 o = new Oi3() {  
            @Override // 重写  
            public void name() {  
                System.out.println("成都码到功成");  
            }  
        };  
        o.name();// 调用  
    }  
}

另外一个示例(典型的监听窗口关闭的测试类):

this.addWindowListener(new WindowAdapter() {  
    @Override  
    public void windowClosing(WindowEvent e) {  
        // TODO Auto-generated method stub  
        System.exit(0);  
    }  
});

局部内部类

定义在方法内部,要访问必须在方法内部先访问它.

然后调用这个方法才可能访问。

实例:

package com.itcode.demo2;  

/**      
 * @author: 成都码到功成学员  
 * @Description:  
 *  局部内部类的使用 
 */  

public class TestOI4{  
    public void show(){  
        //局部内部类,作用域仅限于此方法  
        class OITest4{  
            public void show(){  
                System.out.println("局部内部类");  
            }  
        }  
        //访问局部内部类  
        OITest4 ot = new OITest4();  
        ot.show();  
    }  
    public static void main(String[] args) {  
        TestOI4 t4 = new TestOI4();  
        t4.show();  
    }  
}

内部类综合演示

示例:

class Outer{  
    int a = 10;  
    class Inner{//成员内部类  
        int a =20;  
        public void show(){  
            int a = 30;  
            System.out.println(a);//30  
            System.out.println(this.a);//20  
            System.out.println(Outer.this.a);//10  
        }  
    }  
    static int b =1;  
    static class Inner2{//静态内部类  
        int b=2;  
        public void show(){  
            int b =3;  
            System.out.println(b);//3  
            System.out.println(this.b);// 2  
            System.out.println(Outer.b);// 1  
        }  
    }  
    public void show(){  
        class Inner3{// 局部内部类,范围仅限于局部(方法)内。  
            public void eat(){  
                System.out.println("eat");  
            }  
        }  
        Inner3 i = new Inner3();//访问局部内部类,注意:必须先建立类再访问  
        i.eat();  
        System.out.println("局部内部类");  
    }  
}  
public class TestInner extends Thread{  
    public static void main(String[] args){  
        //访问成员内部类  
        Outer.Inner oi = new Outer().new Inner();  
        oi.show();  
        // 访问静态内部类  
        Outer.Inner2 oi2 = new Outer.Inner2();  
        oi2.show();  
        // 访问局部内部类  
        Outer a =new Outer();  
        a.show();  
        // 匿名内部类  
        Thread t = new TestInner(){  
            public void run(){  
                System.out.println("匿名内部类方法");  
            }  
        };  
        t.run();//访问匿名内部类  
    }  

}

效果:

Last updated

Was this helpful?