内部类和匿名内部类

来源:互联网 发布:我要开网络推广公司 编辑:程序博客网 时间:2024/05/29 17:17

把类定义在其他类的内部, 这个类就被称为内部类
举例: 在类 A 中定义了一个类 B, 类 B 就是内部类。

内部类的访问特点:
内部类可以直接访问外部类的成员, 包括私有。
外部类要访问内部类的成员, 必须创建对象。

按照内部类在类中定义的位置不同, 可以分为如下两种格式:

成员位置(成员内部类)

一般内部类就是不让外界直接访问的。
成员内部的常见修饰符:private 、static
private 为了保证数据的安全性
static 为了让数据访问更方便(ps:被静态修饰的成员内部类只能访问外部类的静态成员

class Outer {    private int num = 10;    private static int num2 = 100;    //内部类用静态修饰是因为内部类可以看出是外部类的成员    public static class Inner {        public void show() {            //System.out.println(num);            System.out.println(num2);        }        public static void show2() {            //System.out.println(num);            System.out.println(num2);        }    }} class InnerClassDemo4 {    public static void main(String[] args) {        //使用内部类        // 限定的新静态类        //Outer.Inner oi = new Outer().new Inner();        //oi.show();        //oi.show2();        //成员内部类被静态修饰后的访问方式是:        //格式: 外部类名.内部类名 对象名 = new 外部类名.内部类名();        Outer.Inner oi = new Outer.Inner();        oi.show();        oi.show2();        //show2()的另一种调用方式        Outer.Inner.show2();    }}

局部位置(局部内部类)

可以直接访问外部类的成员
可以创建内部类对象, 通过对象调用内部类方法, 来使用局部内部类功能
局部内部类访问局部变量的注意事项:
必须被 final 修饰。
因为局部变量会随着方法的调用完毕而消失, 这个时候, 局部对象并没有立马从堆内存中消失, 还要使用那个变量。 为了让数据还能继续被使用, 就用 fianl 修饰, 这样, 在堆内存里面存储的其实是一个常量值。 通过反编译工具可以看一下。

class Outer {    private int num = 10;    public void method() {        //int num2 = 20;        //final int num2 = 20;        class Inner {            public void show() {                System.out.println(num);                //从内部类中访问本地变量 num2; 需要被声明为最终类型                System.out.println(num2);//20            }        }         //System.out.println(num2);        Inner i = new Inner();        i.show();    }} class InnerClassDemo5 {    public static void main(String[] args) {        Outer o = new Outer();        o.method();    }}

上述例子能看出来局部内部类的执行范围只能在它其中的方法中。

匿名内部类
就是内部类的简化写法。
前提:1. 存在一个类或者接口2.这里的类可以是具体类也可以是抽象类。
格式:new 类名或者接口名() {重写方法;}
本质:是一个继承了类或者实现了接口的子类匿名对象

interface Inter {    public abstract void show();    public abstract void show2();}class Outer {    public void method() {        Inter i = new Inter() { //多态            public void show() {                System.out.println("show");            }             public void show2() {                System.out.println("show2");            }        };        i.show();        i.show2();    }}