Java_13 内部类

来源:互联网 发布:网络彩票停售 编辑:程序博客网 时间:2024/05/17 23:33

1.成员内部类

成员内部类:在一个类中使用内部类可以在内部类中直接存取其所在类的私有成员变量
    public class OuterClass{        private class InnerClass{            //...        }    }
内部类的实例一定要绑定在外部类的实例上,如果在外部类中初始化一个内部类对象,那么内部类就会绑定在这个外部类的对象上,内部类的初始化方式与其他类的初始化方式相同,都是使用关键自new如果在外部类和非静态方法之外实例化内部类对象,需要使用“外部类.内部类”的形式指定该对象的类型内部类对象会依赖于外部类对象,除非已经存在一个外部类对象,否则类中不会出现内部类对象使用this关键字获取内部类与外部类的引用如果在外部类中定义的成员变量与内部类的成员变量名称相同,可以使用this关键字
public class TheSameName{    private int x;    private class Inner{        private int x=9;        public void doit(int x){            x++;                  //调用形参x            this.x++;             //调用内部类的变量x            TheSameName.this.x++; //调用外部类的变量x        }    }}

2.局部内部类

局部内部类是指在类的方法中定义的内部类,它的作用范围也是在这个方法体中局部内部类是所在方法的一部分,在此方法体外无法对局部内部类进行访问,但是局部内部类可以访问当前代码块的常量以及此外部类的所有成员

3.匿名内部类

在编写代码时,不一定要给内部类取一个名字,可以直接以对象名来代替,匿名内部类所有的实现代码都需要在大括号之间进行编写在图形化编程的事件监控器代码中,会大量使用匿名内部类,大大简化代码,并增强代码可读性
return new A(){    ...//内部类体,A是对象名}
由于匿名内部类没有名称,所以匿名内部类使用默认的构造方法来生成匿名内部类的对象,在匿名内部类定义结束后,需要加分号标识,这个分号并不代表定义内部类结束的标识,而代表创建匿名内部类的引用表达式的标识匿名内部类编译后,会产生以“外部类名$序号”为名称的.class文件,序号以1~n排列,分别代表1~n个匿名内部类

4.静态内部类

在内部类前添加修饰符static,这个内部类就会变为静态内部类。一个静态内部类中可以声明static成员,但是在非静态内部类中不可以声明静态成员。静态内部类有一个最大的特点,就是不可以使用外部类的非静态成员,所以静态内部类在开发中比较少见创建静态内部类的对象,不需要其外部类的对象不能从静态内部类的对象中访问非静态外部类的对象

5.内部类的继承

内部类也和其他普通类一样可以被继承,但继承内部类比继承普通类要复杂一些,需要设置专门的语法完成
//创建OutputInnerClass类,使OutputInnerClass类继承ClassA类中的内部类ClassBpublic class OutputInnerClass extends ClassA.ClassB{    public OutputInneClass(ClassA a){        a.super();    }}class ClassA{    class ClassB{    }}
必须有一个带有参数的构造方法,并且该构造方法的参数需要继承内部类的外部类的引用在构造方法中使用a.super()语句,为继承提供必要的对象引用

6.范例

//利用局部内部类设置闹钟public class AlarmClock{    private int delay;  //表示延迟时间    private boolean flag; //表示是否要发出声音    public AlarmClock(int delay,boolean flag){        this.delay = delay;        this.flag = flag;    }    public void start(){        class Printer implements ActionListener{ //定义内部类实现动作监听接口            @Override            public void actionPerformed(ActionEvent e){                SimpleDateFormat format = new SimpleDateFormat("k:m:s");  //定义时间的格式                String result = format.format(new Date());  //获得当前时间                System.out.println("当前时间是:"+result); //显示当前时间                if(flag){                    Toolkit.getDefaultToolkit().beep();  //根据flag来决定是否发出声音                }            }        }        new Timer(dalay,new Printer()).start();  //创建Timer对象并启动    }}
原创粉丝点击